diff --git a/README.md b/README.md index 6cd9fa4..92d9cdb 100644 --- a/README.md +++ b/README.md @@ -1,104 +1,104 @@ CDRTool ======= -Copyright (c) 2002-2020 AG Projects +Copyright (c) 2002-2022 AG Projects https://ag-projects.com CDRTool provides a CDR mediation and rating engine for Call Details Records generated by OpenSIPS SIP Proxy/Registrar/Presence server. CDRTool is a simple to use WEB application, which can be put in service with minimal training of the helpdesk and operations staff. It provides instant access to SIP usage information, traces from CDR level to protocol level, statistics grouped by criteria like release cause, destination or billing parties and can help pin-point SIP call flows failure reason. CDRTool provides accurate accounting for call detail records generated by OpenSIPS when used in combination with MediaProxy regardless of the availability of BYE messages. CDRTool provides an anti-fraud mechanism for OpenSIPS by blocking SIP susbcribers that exceed a predefined monthly quota. CDRTool rating functions are available from the network over a TCP socket and can be used for both postpaid and prepaid applications. Call Control prepaid application for OpenSIPS is available to provide session control for prepaid services. Target market ------------- CDRTool is a mature product with several years in production and has been used in environments with up to tens of millions of CDRs per month. The main goal of CDRTool is to provide a carrier grade mediation and rating engine for service providers deploying OpenSIPS as SIP Proxy/Registrar. Disclaimer ---------- The information provided by CDRTool documentation is not always enough to successfully complete the installation and deployment of CDRTool. Most of the configuration tasks are related to setting up components outside CDRTool environment. Good knowledge in the configuration of MySQL, FreeRadius, MediaProxy and OpenSIPS are required to successfully complete a CDRTool installation. Features -------- CDRTool allows real-time web access to Call Details Records generated by OpenSIPS radius accounting and sip trace modules. The information can be combined with media information logged by MediaProxy while a separate OpenSIPS module can display complete messages of all SIP messages the enter and exit the SIP Proxy. CDRs can be filtered and statistics can be built in real-time to summarize service usage based on various criteria. Multiple users can share the CDR search criteria and the query results. Ticket numbers can be linked to sets of Call Details Records. Queries and results can be replayed later to reproduce an exiting or a previous problem. This feature allows fast communication and troubleshooting when multiple departments work together to find a resolution for a problem and communicate it with the customer. * Real-time rating engine for postpaid and prepaid accounting * Web and CSV file management for rating tables * CDR search with query criteria saved for later use * Search results can be grouped by any field available in the CDR * Links from CDR level down to SIP trace and Media trace level * Multiple data-sources with consistent search and export capabilities * Login accounts can restrict access to CDRs per subscriber, domain or gateway * Rating based on day of week, time of day, duration, destination and ENUM tree * Display ongoing media sessions from MediaProxy * Display registered SIP accounts from OpenSIPS * Displays SIP trace from sip_trace OpenSIPS module * Displays Media trace from MediaProxy media_sesions table * Manage prepaid cards and accounts for Call Control * Builds graphical usage statistics for SIP platform usage Data sources ------------ - OpenSIPS - MediaProxy - Asterisk Other data sources that use Radius can be easily ported. Installation ------------ See INSTALL file. Using CDRTool ------------- See USAGE file. diff --git a/debian/copyright b/debian/copyright index 9c61ff6..5c6e2a1 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,18 +1,18 @@ CDRTool ------- CDRTool is licensed under GNU PUBLIC LICENSE version 2.0. -Copyright (c) 2002-2020 AG Projects +Copyright (c) 2002-2022 AG Projects https://ag-projects.com THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/library/ngnpro_client.php b/library/ngnpro_client.php index fe92da0..0caba89 100644 --- a/library/ngnpro_client.php +++ b/library/ngnpro_client.php @@ -1,16126 +1,16126 @@ SoapEngine() function if ($adminonly) { $login_credentials=array( 'login_type' => 'admin', 'reseller' => $reseller, 'customer' => $customer, 'extra_form_elements' => array() ); } else { $login_credentials=array( 'login_type' => 'reseller', 'soap_username' => $soapUsername, 'soap_password' => $soapPassword, 'reseller' => $reseller, 'customer' => $customer, 'extra_form_elements' => array() ); } // login_credentials can overwite SoapEngine->ports $login_credentials['ports']['customers'] = array( 'records_class' => 'Customers', 'name' => 'Login accounts', 'soap_class' => 'WebService_NGNPro_CustomerPort', 'category' => 'general', 'description' => 'Manage login accounts, customer information and properties. Customer id can be assigned to entities like SIP domains and ENUM ranges. Use _ or % to match one or more characters. ' ); require_once("ngnpro_client.phtml"); require("/etc/cdrtool/ngnpro_engines.inc"); $extraFormElements=array(); //////////////////////////////// // How to create a SIP record // //////////////////////////////// $sip_engine = 'sip_accounts@engine'; $this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $sipAccount = array('account' => 'user@example.com', 'quota' => $quota, 'prepaid' => $prepaid, 'password' => $password, 'pstn' => true, 'owner' => $owner, 'customer' => $customer, 'reseller' => $reseller ); $this->sipRecords->addRecord($sipAccount); //////////////////////////////// // How to create a SIP domain // //////////////////////////////// $sip_engine = 'sip_accounts@engine'; $this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $sipDomain = array('domain' => 'example.com', 'customer' => $customer, 'reseller' => $reseller ); $this->sipRecords->addRecord($sipDomain); /////////////////////////////// // How to create a SIP alias // /////////////////////////////// $sip_engine = 'sip_aliases@engine'; $this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $sipAlias = array('alias' => 'user@example1.com', 'target' => 'user@example2.com', 'owner' => $owner, 'customer' => $customer, 'reseller' => $reseller ); $this->sipRecords->addRecord($sipAlias); /////////////////////////////////// // How to create an ENUM mapping // /////////////////////////////////// $enum_engine = 'enum_numbers@engine'; $this->EnumSoapEngine = new SoapEngine($enum_engine,$soapEngines,$login_credentials); $_enum_class = $this->EnumSoapEngine->records_class; $this->enumRecords = new $_enum_class($this->EnumSoapEngine); $enumMapping = array('tld' => $tld, 'number' => $number, 'type' => 'sip', 'mapto' => 'sip:user@example.com', 'owner' => $owner, 'customer' => $customer, 'reseller' => $reseller ); $this->enumRecords->addRecord($enumMapping); */ class SoapEngine { public $version = 1; public $adminonly = 0; public $customer = 0; public $reseller = 0; public $login_type = 'reseller'; public $allowedPorts = array(); public $timeout = 5; public $exception = array(); public $result = false; public $extraFormElements = array(); public $default_enum_tld = 'e164.arpa'; public $default_timezone = 'Europe/Amsterdam'; public $default_sip_proxy = ""; public $default_msrp_relay = ""; public $ports = array( 'sip_accounts' => array( 'records_class' => 'SipAccounts', 'name' => 'SIP accounts', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'sip', 'description' => 'Manage SIP accounts and their settings. Click on the SIP account to access the settings page. Use _ or % to match one or more characters. ', ), 'customers' => array( 'records_class' => 'Customers', 'name' => 'Owner Accounts', 'soap_class' => 'WebService_NGNPro_CustomerPort', 'category' => 'general', 'description' => 'Manage accounts with address information and other properties. SIP domains and ENUM ranges can be assigned to accounts. Use _ or % to match one or more characters. ' ), 'sip_domains' => array( 'records_class' => 'SipDomains', 'name' => 'SIP domains', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'sip', 'description' => 'Manage SIP domains (e.g example.com) served by the SIP Proxy. Use _ or % to match one or more characters. ' ), 'trusted_peers' => array( 'records_class' => 'TrustedPeers', 'name' => 'Trusted peers', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'sip', 'description' => 'Manage trusted parties that are allowed to route sessions through the SIP proxy without digest authentication. ', 'resellers_only'=> true ), 'enum_numbers' => array( 'records_class' => 'EnumMappings', 'name' => 'ENUM numbers', 'soap_class' => 'WebService_NGNPro_EnumPort', 'category' => 'dns', 'description' => 'Manage E164 numbers used for incoming calls and their mappings (e.g. +31123456789 map to sip:user@example.com). Use _ or % to match one or more characters. ' ), 'enum_ranges' => array( 'records_class' => 'EnumRanges', 'name' => 'ENUM ranges', 'soap_class' => 'WebService_NGNPro_EnumPort', 'category' => 'dns', 'description' => 'Manage E164 number ranges that hold individual phone numbers. Use _ or % to match one or more characters. ' ), 'dns_zones' => array( 'records_class' => 'DnsZones', 'name' => 'DNS zones', 'soap_class' => 'WebService_NGNPro_DnsPort', 'category' => 'dns', 'description' => 'Manage DNS zones. Use _ or % to match one or more characters. ' ), 'dns_records' => array( 'records_class' => 'DnsRecords', 'name' => 'DNS records', 'soap_class' => 'WebService_NGNPro_DnsPort', 'category' => 'dns', 'description' => 'Manage DNS records. Use _ or % to match one or more characters. ' ), 'pstn_carriers' => array( 'records_class' => 'Carriers', 'name' => 'PSTN carriers', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'pstn', 'description' => 'Manage outbound carriers for PSTN traffic. Click on Carier to edit its attributes. ', 'resellers_only'=> true ), 'pstn_gateways' => array( 'records_class' => 'Gateways', 'name' => 'PSTN gateways', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'pstn', 'description' => 'Manage outbound PSTN gateways. Click on Gateway to edit its attributes. ', 'resellers_only'=> true ), 'pstn_routes' => array( 'records_class' => 'Routes', 'name' => 'PSTN routes', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'pstn', 'description' => 'Manage outbound PSTN routes. A prefix must be formated as 00+E164, an empty prefix matches all routes. ', 'resellers_only'=> true ), 'gateway_rules' => array( 'records_class' => 'GatewayRules', 'name' => 'PSTN rules', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'pstn', 'description' => 'Manage translation rules for PSTN gateways. Rules are applied against 00+E164 prefix. Click on Rule to edit its attributes. ', 'resellers_only'=> true ), 'email_aliases' => array( 'records_class' => 'EmailAliases', 'name' => 'Email aliases', 'soap_class' => 'WebService_NGNPro_DnsPort', 'category' => 'dns', 'description' => 'Manage email aliases. Use _ or % to match one or more characters. ' ), 'url_redirect' => array( 'records_class' => 'UrlRedirect', 'name' => 'URL redirect', 'soap_class' => 'WebService_NGNPro_DnsPort', 'category' => 'dns', 'description' => 'Manage WEB URL redirections. Use _ or % to match one or more characters. ' ), 'sip_aliases' => array( 'records_class' => 'SipAliases', 'name' => 'SIP aliases', 'soap_class' => 'WebService_NGNPro_SipPort', 'category' => 'sip', 'description' => 'Manage redirections for SIP addresses e.g. redirect user1@example1.com (alias) to user2@example2.com (target). Use _ or % to match one or more characters. ' ) ); /** * service is port@engine where: * * - port is an available NGNPro service * - engine is a connection to an NGNPro server * * - soapEngines is an array of NGNPro connections and * settings belonging to them: * * $soapEngines = array( * 'mdns' => array( * 'name' => 'Managed DNS', * 'username' => 'soapadmin', * 'password' => 'passwd', * 'url' => 'http://example.com:9200/' * ) * ); */ public function __construct($service, $soapEngines, $login_credentials = array()) { $this->login_credentials = &$login_credentials; if (is_array($this->login_credentials['ports'])) { $_ports = array(); foreach (array_keys($this->ports) as $_key) { if (in_array($_key, array_keys($this->login_credentials['ports']))) { if (strlen($this->login_credentials['ports'][$_key]['records_class'])) { $_ports[$_key]['records_class'] = $this->login_credentials['ports'][$_key]['records_class']; } else { $_ports[$_key]['records_class'] = $this->ports[$_key]['records_class']; } if (strlen($this->login_credentials['ports'][$_key]['soap_class'])) { $_ports[$_key]['soap_class'] = $this->login_credentials['ports'][$_key]['soap_class']; } else { $_ports[$_key]['soap_class'] = $this->ports[$_key]['soap_class']; } if (strlen($this->login_credentials['ports'][$_key]['name'])) { $_ports[$_key]['name'] = $this->login_credentials['ports'][$_key]['name']; } else { $_ports[$_key]['name'] = $this->ports[$_key]['name']; } if (strlen($this->login_credentials['ports'][$_key]['description'])) { $_ports[$_key]['description'] = $this->login_credentials['ports'][$_key]['description']; } else { $_ports[$_key]['description'] = $this->ports[$_key]['description']; } } else { $_ports[$_key] = $this->ports[$_key]; } } $this->ports = $_ports; } //dprint_r($this->login_credentials); if ($this->login_credentials['login_type'] == 'admin') $this->adminonly = 1; if (strlen($this->login_credentials['soap_filter'])) { $this->soapEngines = $this->getSoapEngineAllowed($soapEngines, $this->login_credentials['soap_filter']); } else { $this->soapEngines = $soapEngines; } if (is_array($this->soapEngines)) { $_engines = array_keys($this->soapEngines); if (!$service) { // use first engine available if (is_array($this->allowedPorts) && count($this->allowedPorts[$_engines[0]]) > 0) { $_ports = $this->allowedPorts[$_engines[0]]; } else { $_ports = array_keys($this->ports); } // default service is: $service = $_ports[0].'@'.$_engines[0]; } if (is_array($this->login_credentials['extra_form_elements'])) { $this->extraFormElements = $this->login_credentials['extra_form_elements']; } $this->service = $service; $_els = explode('@', $this->service); if (!$_els[1]) { $this->soapEngine = $_engines[0]; } else { $this->soapEngine = $_els[1]; } $this->sip_engine = $this->soapEngine; if (strlen($this->soapEngines[$this->soapEngine]['version'])) { $this->version = $this->soapEngines[$this->soapEngine]['version']; } $default_port = 'customers'; if (count($this->allowedPorts[$this->soapEngine]) > 0) { if (in_array($_els[0], $this->allowedPorts[$this->soapEngine])) { $this->port = $_els[0]; } else if (in_array($default_port, $this->allowedPorts[$this->soapEngine])) { $this->port = $default_port; } else { // disable some version dependent ports foreach (array_keys($this->ports) as $_p) { if (in_array($_p, $this->allowedPorts[$this->soapEngine])) { $this->port = $_p; break; } } } } else { if ($_els[0]) { $this->port = $_els[0]; } else { $this->port = $default_port; } } $this->records_class = $this->ports[$this->port]['records_class']; $this->soap_class = $this->ports[$this->port]['soap_class']; $this->service = $this->port.'@'.$this->soapEngine; foreach (array_keys($this->soapEngines) as $_key) { $this->skip[$_key] = $this->soapEngines[$_key]['skip']; if ($this->soapEngines[$_key]['skip_ports']) { $this->skip_ports[$_key] = $this->soapEngines[$_key]['skip_ports']; } } $this->impersonate = intval($this->soapEngines[$this->soapEngine]['impersonate']); if ($this->soapEngines[$this->soapEngine]['default_enum_tld']) { $this->default_enum_tld = $this->soapEngines[$this->soapEngine]['default_enum_tld']; } if ($this->soapEngines[$this->soapEngine]['default_timezone']) { $this->default_timezone = $this->soapEngines[$this->soapEngine]['default_timezone']; } if ($this->soapEngines[$this->soapEngine]['sip_proxy']) { $this->default_sip_proxy = $this->soapEngines[$this->soapEngine]['sip_proxy']; } if ($this->soapEngines[$this->soapEngine]['msrp_relay']) { $this->default_msrp_relay = $this->soapEngines[$this->soapEngine]['msrp_relay']; } if ($this->soapEngines[$this->soapEngine]['default_country']) { $this->default_country = $this->soapEngines[$this->soapEngine]['default_country']; } if (strlen($this->soapEngines[$this->soapEngine]['sip_engine'])) { $this->sip_engine = $this->soapEngines[$this->soapEngine]['sip_engine']; } if (strlen($this->soapEngines[$this->soapEngine]['voicemail_engine'])) { $this->voicemail_engine = $this->soapEngines[$this->soapEngine]['voicemail_engine']; } if (strlen($this->login_credentials['customer_engine'])) { $this->customer_engine = $this->login_credentials['customer_engine']; } else if (strlen($this->soapEngines[$this->soapEngine]['customer_engine'])) { $this->customer_engine = $this->soapEngines[$this->soapEngine]['customer_engine']; } else { $this->customer_engine = $this->soapEngine; } if (strlen($this->soapEngines[$this->soapEngine]['sip_settings_page'])) { $this->sip_settings_page = $this->soapEngines[$this->soapEngine]['sip_settings_page']; } if (strlen($this->soapEngines[$this->soapEngine]['call_limit'])) { $this->call_limit = $this->soapEngines[$this->soapEngine]['call_limit']; } if (strlen($this->soapEngines[$this->soapEngine]['digest_settings_page'])) { $this->digest_settings_page = $this->soapEngines[$this->soapEngine]['digest_settings_page']; } if (is_array($this->soapEngines[$this->soapEngine]['customer_properties'])) { $this->customer_properties = $this->soapEngines[$this->soapEngine]['customer_properties']; } if (strlen($this->soapEngines[$this->soapEngine]['timeout'])) { $this->timeout = intval($this->soapEngines[$this->soapEngine]['timeout']); } if (strlen($this->soapEngines[$this->soapEngine]['store_clear_text_passwords'])) { $this->store_clear_text_passwords = $this->soapEngines[$this->soapEngine]['store_clear_text_passwords']; } if (strlen($this->soapEngines[$this->soapEngine]['allow_none_local_dns_zones'])) { $this->allow_none_local_dns_zones = $this->soapEngines[$this->soapEngine]['allow_none_local_dns_zones']; } if (strlen($this->login_credentials['record_generator'])) { $this->record_generator = $this->login_credentials['record_generator']; } else if (strlen($this->soapEngines[$this->soapEngine]['record_generator'])) { $this->record_generator = $this->soapEngines[$this->soapEngine]['record_generator']; } if (strlen($this->login_credentials['name_servers'])) { $this->name_servers = $this->login_credentials['name_servers']; } else if (strlen($this->soapEngines[$this->soapEngine]['name_servers'])) { $this->name_servers = $this->soapEngines[$this->soapEngine]['name_servers']; } if (strlen($login_credentials['reseller'])) { $this->reseller = $login_credentials['reseller']; } else if ($this->adminonly && $_REQUEST['reseller_filter']) { $this->reseller = $_REQUEST['reseller_filter']; } if (strlen($login_credentials['customer'])) { $this->customer = $login_credentials['customer']; } else if ($this->adminonly && $_REQUEST['customer_filter']) { $this->customer = $_REQUEST['customer_filter']; } if (strlen($login_credentials['soap_username'])) { $this->soapUsername=$login_credentials['soap_username']; $this->SOAPlogin = array( "username" => $this->soapUsername, "password" => $login_credentials['soap_password'], "admin" => false ); } else { // use the credentials defined for the soap engine $this->soapUsername = $this->soapEngines[$this->soapEngine]['username']; if ($this->customer) { $this->SOAPlogin = array( "username" => $this->soapUsername, "password" => $this->soapEngines[$this->soapEngine]['password'], "admin" => true, "impersonate" => intval($this->customer) ); } else { $this->SOAPlogin = array( "username" => $this->soapUsername, "password" => $this->soapEngines[$this->soapEngine]['password'], "admin" => true, "impersonate" => intval($this->reseller) ); } $this->SOAPloginAdmin = array( "username" => $this->soapUsername, "password" => $this->soapEngines[$this->soapEngine]['password'], "admin" => true ); } $this->SOAPurl = $this->soapEngines[$this->soapEngine]['url']; $log = sprintf( "

%s at %s as %s ", $this->soap_class, $this->SOAPurl, $this->SOAPurl, $this->soapUsername ); dprint($log); $this->SoapAuth = array('auth', $this->SOAPlogin , 'urn:AGProjects:NGNPro', 0, ''); $this->SoapAuthAdmin = array('auth', $this->SOAPloginAdmin , 'urn:AGProjects:NGNPro', 0, ''); // Instantiate the SOAP client if (!class_exists($this->soap_class)) return ; $this->soapclient = new $this->soap_class($this->SOAPurl); $this->soapclient->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->soapclient->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); // set the timeout $this->soapclient->_options['timeout'] = $this->timeout; if ($this->customer_engine) { $this->SOAPloginCustomers = array( "username" => $this->soapEngines[$this->customer_engine]['username'], "password" => $this->soapEngines[$this->customer_engine]['password'], "admin" => true, "impersonate" => intval($this->reseller) ); $this->SoapAuthCustomers = array('auth', $this->SOAPloginCustomers , 'urn:AGProjects:NGNPro', 0, ''); $this->SOAPurlCustomers = $this->soapEngines[$this->customer_engine]['url']; $this->soapclientCustomers = new WebService_NGNPro_CustomerPort($this->SOAPurlCustomers); $this->soapclientCustomers->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->soapclientCustomers->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if (strlen($this->soapEngines[$this->customer_engine]['timeout'])) { $this->soapclientCustomers->_options['timeout'] = intval($this->soapEngines[$this->customer_engine]['timeout']); } else { $this->soapclientCustomers->_options['timeout'] = $this->timeout; } } if ($this->voicemail_engine) { $this->SOAPloginVoicemail = array( "username" => $this->soapEngines[$this->voicemail_engine]['username'], "password" => $this->soapEngines[$this->voicemail_engine]['password'], "admin" => true, "impersonate" => intval($this->reseller) ); $this->SoapAuthVoicemail = array('auth', $this->SOAPloginVoicemail , 'urn:AGProjects:NGNPro', 0, ''); $this->SOAPurlVoicemail = $this->soapEngines[$this->voicemail_engine]['url']; $this->soapclientVoicemail = new WebService_NGNPro_VoicemailPort($this->SOAPurlVoicemail); $this->soapclientVoicemail->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->soapclientVoicemail->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if (strlen($this->soapEngines[$this->voicemail_engine]['timeout'])) { $this->soapclientVoicemail->_options['timeout'] = intval($this->soapEngines[$this->voicemail_engine]['timeout']); } else { $this->soapclientVoicemail->_options['timeout'] = $this->timeout; } } } else { print "Error: No SOAP credentials defined."; } $this->url = $_SERVER['PHP_SELF']."?1=1"; foreach (array_keys($this->extraFormElements) as $element) { if (!strlen($this->extraFormElements[$element])) continue; $this->url .= sprintf( '&%s=%s', $element, urlencode($this->extraFormElements[$element]) ); } $this->support_email = $this->soapEngines[$this->soapEngine]['support_email']; $this->support_web = $this->soapEngines[$this->soapEngine]['support_web']; $this->welcome_message = $this->soapEngines[$this->soapEngine]['welcome_message']; } /** * returns a list of allowed engines based on a filter * the filter format is: * engine1:port1,port2 engine2 engine3:port1 */ public function getSoapEngineAllowed($soapEngines, $filter) { if (!$filter) { $soapEngines_checked = $soapEngines; } else { $_filter_els = explode(" ", $filter); foreach (array_keys($soapEngines) as $_engine) { foreach ($_filter_els as $_filter) { unset($_allowed_engine); $_allowed_ports = array(); list($_allowed_engine, $_allowed_ports_els) = explode(":", $_filter); if ($_allowed_ports_els) { $_allowed_ports = explode(",", $_allowed_ports_els); } if (count($_allowed_ports) == 0) { $_allowed_ports = array_keys($this->ports); } if ($_engine == $_allowed_engine) { $soapEngines_checked[$_engine] = $soapEngines[$_engine]; $this->allowedPorts[$_engine] = $_allowed_ports; continue; } } } } return $soapEngines_checked; } /** * $function = array( * 'commit' => array( * 'name' => 'addAccount', * 'parameters' => array( * $param1, * $param2 * ), * 'logs' => array( * 'success' => 'The function was a success', * 'failure' => 'The function has failed' * ) * ) * ); */ public function execute($function, $html = true, $adminonly = false) { if (!$function['commit']['name']) { if ($html) { print "Error: no function name supplied"; } else { print "Error: no function name supplied\n"; } return false; } if ($adminonly) { $this->soapclient->addHeader($this->SoapAuthAdmin); } else { $this->soapclient->addHeader($this->SoapAuth); } $result = call_user_func_array( array( $this->soapclient, $function['commit']['name'] ), $function['commit']['parameters'] ); if ((new PEAR)->isError($result)) { $this->error_msg = $result->getMessage(); $this->error_fault = $result->getFault(); $this->error_code = $result->getCode(); $this->exception = $this->error_fault->detail->exception; $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SOAPurl, $this->error_msg, $this->error_fault->detail->exception->errorcode, $this->error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); if ($html) { $log = sprintf( "SOAP query failed: %s (%s): %s", $this->error_msg, $this->error_fault->detail->exception->errorcode, $this->error_fault->detail->exception->errorstring ); print "$log"; } return false; } else { $this->result = $result; if ($function['commit']['logs']['success']) { if ($html) { printf( "

%s \n", htmlentities($function['commit']['logs']['success']) ); } } if (is_object($result) || strlen($result)) { return $result; } else { return true; } } } } class Records { public $maxrowsperpage = '20'; public $sip_settings_page = 'sip_settings.phtml'; public $allowedDomains = array(); public $selectionActive = false; public $selectionKeys = array(); public $resellers = array(); public $customers = array(); public $record_generator = false; public $customer_properties = array(); public $loginProperties = array(); public $errorMessage = ''; public $html = true; public $filters = array(); public $selectionActiveExceptions = array(); function log_action($action = 'Unknown') { global $CDRTool; $location = "Unknown"; $_loc = geoip_record_by_name($_SERVER['REMOTE_ADDR']); if ($_loc['country_name']) { $location = $_loc['country_name']; } $log = sprintf( "CDRTool login username=%s, type=%s, impersonate=%s, IP=%s, location=%s, action=%s:%s, script=%s", $this->login_credentials['username'], $this->login_credentials['login_type'], $CDRTool['impersonate'], $_SERVER['REMOTE_ADDR'], $location, $this->SoapEngine->port, $action, $_SERVER['PHP_SELF'] ); syslog(LOG_NOTICE, $log); } function Records($SoapEngine) { $this->SoapEngine = $SoapEngine; $this->version = $this->SoapEngine->version; $this->login_credentials = $this->SoapEngine->login_credentials; $this->sorting['sortBy'] = trim($_REQUEST['sortBy']); $this->sorting['sortOrder'] = trim($_REQUEST['sortOrder']); $this->next = $_REQUEST['next']; $this->adminonly = $this->SoapEngine->adminonly; $this->reseller = $this->SoapEngine->reseller; $this->customer = $this->SoapEngine->customer; $this->impersonate = $this->SoapEngine->impersonate; $this->url = $this->SoapEngine->url; foreach (array_keys($this->filters) as $_filter) { if (strlen($this->filters[$_filter]) && !in_array($_filter, $this->selectionActiveExceptions)) { $this->selectionActive = true; break; } } if ($this->adminonly) { $this->url .= sprintf('&adminonly=%s', $this->adminonly); if ($this->login_credentials['reseller']) { $this->filters['reseller'] = $this->login_credentials['reseller']; } else { $this->filters['reseller'] = trim($_REQUEST['reseller_filter']); } } $this->filters['customer'] = trim($_REQUEST['customer_filter']); //$this->getResellers(); $this->getCustomers(); $this->getLoginAccount(); if (strlen($this->SoapEngine->sip_settings_page)) { $this->sip_settings_page = $this->SoapEngine->sip_settings_page; } if (strlen($this->SoapEngine->digest_settings_page)) { $this->digest_settings_page = $this->SoapEngine->digest_settings_page; } $this->support_email = $this->SoapEngine->support_email; $this->support_web = $this->SoapEngine->support_web; } function showEngineSelection() { $selected_soapEngine[$this->SoapEngine->service] =' selected'; $pstn_access = $this->getCustomerProperty('pstn_access'); printf(""); printf( "", $this->url ); } function showAfterEngineSelection() { } function showCustomerSelection() { $this->showCustomerForm(); } function showResellerSelection() { if ($this->adminonly) { $this->showResellerForm(); } else { printf("%s", $this->reseller); } } function showPagination($maxrows) { $url .= $this->url.'&'.$this->addFiltersToURL().sprintf( "&service=%s&sortBy=%s&sortOrder=%s", urlencode($this->SoapEngine->service), urlencode($this->sorting['sortBy']), urlencode($this->sorting['sortOrder']) ); print "

"); } function showSeachFormCustom() { } function showSeachForm() { if ($this->hide_html()) { return; } printf( "

%s", $this->SoapEngine->ports[$this->SoapEngine->port]['description'] ); printf( "

", $_SERVER['PHP_SELF'] ); //print " // //"; print(""); $this->showEngineSelection(); $this->showAfterEngineSelection(); print("
Order by"); $this->showSortForm(); print("
"); $this->printHiddenFormElements('skipServiceElement'); print("

"); print("
"); $this->showTextBeforeCustomerSelection(); print(""); $this->showCustomerSelection(); $this->showResellerSelection(); print("
"); $this->showSeachFormCustom(); print("
"); if ($_REQUEST['action'] != 'Delete') $this->showAddForm(); } function listRecords() { } function getRecordKeys() { } function addRecord($dictionary = array()) { } function deleteRecord($dictionary = array()) { } function showSortCaret($sortSearch) { if ($this->sorting['sortBy'] == $sortSearch && $this->sorting['sortOrder'] == 'DESC') { print(''); } else if ($this->sorting['sortBy'] == $sortSearch && $this->sorting['sortOrder'] == 'ASC') { print(''); } } function tel2enum($tel, $tld) { if (strlen($tld) == 0) $tld="e164.arpa"; // transform telephone number in FQDN Enum style domain name if (preg_match("/^[+]?(\d+)$/", $tel, $m)) { $l = strlen($m[1]); $rev_num = ""; $z = 0; while ($z < $l) { $ss = substr($m[1], $z, 1); $enum = $ss.".".$enum; $z++; } preg_match("/^(.*)\.$/", $enum, $m); $enum = $m[1]; $enum = $enum.".$tld."; return($enum); } else { return($tel); } } function showAddForm() { if ($this->selectionActive) return; } function showSortForm() { if (!count($this->sortElements)) { return; } $selected_sortBy[$this->sorting['sortBy']]='selected'; print ""); $selected_sortOrder[$this->sorting['sortOrder']]='selected'; print(""); } function showTimezones($timezone) { if (!$fp = fopen("timezones", "r")) { print _("Failed to open timezone file."); return false; } print ""; fclose($fp); } function printHiddenFormElements($skipServiceElement = '') { if (!$skipServiceElement) { printf("", $this->SoapEngine->service); } if ($this->adminonly) { printf("", $this->adminonly); } foreach (array_keys($this->SoapEngine->extraFormElements) as $element) { if (!strlen($this->SoapEngine->extraFormElements[$element])) continue; printf( "\n", $element, $this->SoapEngine->extraFormElements[$element] ); } } function getAllowedDomains() { } function showActionsForm() { if (!$this->selectionActive) { return; } $class_name = get_class($this).'Actions'; if (class_exists($class_name)) { $actions = new $class_name($this->SoapEngine, $this->login_credentials); $actions->showActionsForm($this->filters, $this->sorting); } } function executeActions() { $this->showSeachForm(); $this->getRecordKeys(); dprint_r($this->selectionKeys); $class_name=get_class($this).'Actions'; if (class_exists($class_name)) { $actions=new $class_name($this->SoapEngine, $this->login_credentials); $actions->execute( $this->selectionKeys, $_REQUEST['sub_action'], trim($_REQUEST['sub_action_parameter']) ); } } function getCustomers() { if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!$this->filters['reseller']) return; // Filter $filter = array('reseller'=>intval($this->filters['reseller'])); $range = array( 'start' => 0, 'count' => 100 ); // Order $orderBy = array( 'attribute' => 'customer', 'direction' => 'ASC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getCustomers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { if ($result->total > $range['count']) return; if ($range['count'] <= $result->total) { $max = $range['count']; } else { $max = $result->total; } $i = 0; while ($i < $max) { $customer = $result->accounts[$i]; $this->customers[$customer->id] = $customer->firstName.' '.$customer->lastName; $i++; } return true; } } function getResellers() { if (!$this->SoapEngine->customer_engine) { dprint("No customer_engine available"); return true; } if (!$this->adminonly) return; // Filter $filter = array('reseller'=>intval($this->filters['reseller'])); $range = array( 'start' => 0, 'count' => 200 ); // Order $orderBy = array( 'attribute' => 'customer', 'direction' => 'ASC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getResellers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getResellers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { //if ($result->total > $range['count']) return; if ($range['count'] <= $result->total) { $max = $range['count']; } else { $max = $result->total; } $i = 0; while ($i < $max) { $reseller = $result->accounts[$i]; if (strlen($reseller->organization) && $reseller->organization!= 'N/A') { $this->resellers[$reseller->id] = $reseller->organization; } else { $this->resellers[$reseller->id] = $reseller->firstName.' '.$reseller->lastName; } $i++; } dprint_r($this->resellers); return true; } } function getLoginAccount() { if (!$this->SoapEngine->customer_engine) { dprint("No customer_engine available"); return true; } if (!$this->customer) { //print ("No customer available"); return true; } $filter = array('customer'=>intval($this->customer)); $range = array('start' => 0,'count' => 1); $orderBy = array('attribute' => 'customer','direction' => 'ASC'); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getResellers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getResellers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { $this->loginAccount = $result->accounts[0]; $this->loginImpersonate = $result->accounts[0]->impersonate; $this->loginProperties = $this->loginAccount->properties; } if ($this->loginAccount->reseller == $this->customer) { $this->resellerProperties = $this->loginProperties; } else { $filter = array('customer' => intval($this->loginAccount->reseller)); $range = array('start' => 0, 'count' => 1); $orderBy = array('attribute' => 'customer', 'direction' => 'ASC'); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getResellers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getResellers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { $this->resellerProperties=$result->accounts[0]->properties; } } //dprint_r($this->resellerProperties); } function showCustomerForm($name = 'customer_filter') { if ($this->login_credentials['customer'] != $this->login_credentials['reseller']) { printf(" %s ",$this->login_credentials['customer']); } else { if (count($this->customers)) { $select_customer[$this->filters['customer']]='selected'; printf(""); } else { printf( "", $name, $this->filters['customer'] ); } } } function showResellerForm($name = 'reseller_filter') { if (!$this->adminonly) return; if ($this->login_credentials['reseller']) { printf(" %s ",$this->login_credentials['reseller']); } else { if (count($this->resellers)) { $select_reseller[$this->filters['reseller']]='selected'; printf(""); } else { printf( "", $name, $this->filters['reseller'] ); } } } function showTextBeforeCustomerSelection() { print _("Owner"); } function addFiltersToURL() { $url = ''; $j=0; foreach(array_keys($this->filters) as $filter) { if (strlen(trim($this->filters[$filter]))) { if ($j) $url .='&'; $url .= sprintf('%s_filter=%s',$filter,urlencode(trim($this->filters[$filter]))); } $j++; } return $url; } function printFiltersToForm() { foreach(array_keys($this->filters) as $filter) { if (strlen(trim($this->filters[$filter]))) { printf("",$filter,trim($this->filters[$filter])); } } } function getRecord($domain) { } function updateRecord () { } function copyRecord () { } function showRecord($record) { } function RandomString($len=11) { $alf=array("a","b","c","d","e","f", "h","i","j","k","l","m", "n","p","r","s","t","w", "x","y","1","2","3","4", "5","6","7","8","9"); $i=0; while($i < $len) { srand((double)microtime()*1000000); $randval = rand(0,28); $string="$string"."$alf[$randval]"; $i++; } return $string; } function RandomNumber($len=5) { $alf=array("0","1","2","3","4","5", "9","8","7","6"); $i=0; while($i < $len) { srand((double)microtime()*1000000); $randval = rand(0,9); $string="$string"."$alf[$randval]"; $i++; } return $string; } function validDomain($domain) { if (!preg_match ("/^[A-Za-z0-9-.]{1,}\.[A-Za-z]{2,}$/",$domain)) { return false; } return true; } function getCarriers () { if (count($this->carriers)) return true; $Query=array('filter' => array('name'=>''), 'orderBy' => array('attribute' => 'name', 'direction' => 'ASC' ), 'range' => array('start' => 0, 'count' => 1000) ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getCarriers'); $result = $this->SoapEngine->soapclient->getCarriers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->carriers as $_carrier) { $this->carriers[$_carrier->id]=$_carrier->name; } } } function getGateways () { if (count($this->gateways)) return true; $Query=array('filter' => array('name'=>''), 'orderBy' => array('attribute' => 'name', 'direction' => 'ASC' ), 'range' => array('start' => 0, 'count' => 1000) ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getGateways'); $result = $this->SoapEngine->soapclient->getGateways($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->gateways as $_gateway) { $this->gateways[$_gateway->id]=sprintf("%s, Carrier %s",$_gateway->name,$_gateway->carrier); } } } function updateBefore () { return true; } function updateAfter () { return true; } function showCustomerTextBox () { print "
Owner"; if ($this->adminonly) { $this->showCustomerForm('customer'); print "
"; $this->showResellerForm('reseller'); print "
"; } else { $this->showCustomerForm('customer'); } } function makebar($w) { $return = "
"; if ($w < 0) $w = 0; if ($w > 100) $w = 100; $width = $w; $extra = 100 - $w; if ($width < 50) { $color = "black"; $return .= "
"; } else if ($width < 70) { $return .= "
"; } else { $return .= "
"; } $return .="
"; return $return; } function customerFromLogin($dictionary=array()) { if ($this->login_credentials['reseller']) { $reseller = $this->login_credentials['reseller']; if ($dictionary['customer']) { $customer = $dictionary['customer']; } else if ($_REQUEST['customer']) { $customer = $_REQUEST['customer']; } else { $customer = $this->login_credentials['customer']; } } else { if ($dictionary['reseller']) { $reseller = $dictionary['reseller']; } else { $reseller = trim($_REQUEST['reseller']); } if ($dictionary['customer']) { $customer = $dictionary['customer']; } else { $customer = trim($_REQUEST['customer']); } } if (!$customer) $customer = $reseller; return array(intval($customer),intval($reseller)); } function getCustomerProperties($customer='') { if (!$customer) $customer=$this->customer; $log=sprintf("getCustomerProperties(%s,engine=%s)",$customer,$this->SoapEngine->customer_engine); dprint($log); if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!$customer) { dprint ("No customer available"); return true; } $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getProperties'); $result = $this->SoapEngine->soapclientCustomers->getProperties(intval($customer)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->loginProperties=$result; } /* print "
";
         print_r($this->loginProperties);
         print "
"; */ return true; } function setCustomerProperties($properties,$customer='') { if (!$customer) $customer=$this->customer; $log=sprintf("setCustomerProperties(%s,engine=%s)",$customer,$this->SoapEngine->customer_engine); dprint($log); if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!is_array($properties) || !$customer) return true; $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('setProperties'); $result = $this->SoapEngine->soapclientCustomers->setProperties(intval($customer),$properties); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } return true; } function getCustomerProperty($name='') { if (!count($this->loginProperties)) return false; foreach ($this->loginProperties as $_property) { if ($_property->name == $name) { return $_property->value; } } return false; } function getResellerProperty($name='') { if (!count($this->resellerProperties)) return false; foreach ($this->resellerProperties as $_property) { if ($_property->name == $name) { return $_property->value; } } return false; } function checkRecord() { return true; } function showWelcomeMessage() { if (!strlen($this->SoapEngine->welcome_message)) return ; printf ("%s",$this->SoapEngine->welcome_message); } function print_w($obj) { print "
\n";
         print_r($obj);
         print "
\n"; } function hide_html() { return false; } } class SipDomains extends Records { var $FieldsAdminOnly=array( 'reseller' => array('type'=>'integer'), ); var $Fields=array( 'customer' => array('type'=>'integer'), 'certificate' => array('type'=>'text'), 'private_key' => array('type'=>'text'), 'match_ip_address' => array('type'=>'text', 'name'=> 'Match IP addresses'), 'verify_cert' => array('type'=>'boolean'), 'require_cert' => array('type'=>'boolean') ); function SipDomains($SoapEngine) { dprint("init Domains"); $this->filters = array( 'domain' => strtolower(trim($_REQUEST['domain_filter'])) ); $this->Records($SoapEngine); // keep default maxrowsperpage $this->sortElements=array('changeDate' => 'Change date', 'domain' => 'Domain' ); } function listRecords() { $this->showSeachForm(); // Filter $filter=array( 'domain' => $this->filters['domain'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); dprint_r($Query); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); // Call function $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($_REQUEST['action'] == 'Export' and $this->rows) { $this->exportDomain($result->domains[0]->domain); return; } if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "
$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->domains[$i]) break; $domain = $result->domains[$i]; $index = $this->next+$i+1; $delete_url = $this->url.sprintf("&service=%s&action=Delete&domain_filter=%s", urlencode($this->SoapEngine->service), urlencode($domain->domain) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['domain_filter'] == $domain->domain) { $delete_url .= "&confirm=1"; $deleteText = "Confirm"; } else { $deleteText = "Delete"; } if ($_REQUEST['action'] == 'Delete' && $_REQUEST['domain_filter'] == $domain->domain) { $delete_url .= "&confirm=1"; $deleteText = "Confirm"; } else { $deleteText = "Delete"; } $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($domain->customer) ); $_sip_domains_url = $this->url.sprintf("&service=sip_domains@%s&domain_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($domain->domain) ); $_sip_accounts_url = $this->url.sprintf("&service=sip_accounts@%s&domain_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($domain->domain) ); $_sip_aliases_url = $this->url.sprintf("&service=sip_aliases@%s&alias_domain_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($domain->domain) ); if ($this->adminonly) { $export_url = $this->url.sprintf("&service=%s&action=Export&domain_filter=%s", urlencode($this->SoapEngine->service), urlencode($domain->domain) ); printf(" ", $index, $_customer_url, $domain->customer, $domain->reseller, $_sip_domains_url, $domain->domain, $_sip_accounts_url, $_sip_aliases_url, $domain->changeDate, $delete_url, $deleteText, $export_url ); } else { printf(" ", $index, $_customer_url, $domain->customer, $domain->reseller, $_sip_domains_url, $domain->domain, $_sip_accounts_url, $_sip_aliases_url, $domain->changeDate, $delete_url, $deleteText ); } $i++; } } print "
Id Owner SIP domain Change date Actions
%s %s.%s %s Sip accounts Sip aliases %s %s Export
%s %s.%s %s Sip accounts Sip aliases %s %s
"; if ($this->rows == 1) { $this->showRecord($domain); } else { $this->showPagination($maxrows); } return true; } } function showSeachFormCustom() { printf ("

SIP domain
",$this->filters['domain']); } function exportRecord($dictionary=array()) { } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['domain']) { $domain=$dictionary['domain']; } else { $domain=$this->filters['domain']; } if (!strlen($domain)) { print "

Error: missing SIP domain. "; return false; } $function=array('commit' => array('name' => 'deleteDomain', 'parameters' => array($domain), 'logs' => array('success' => sprintf('SIP domain %s has been deleted',$domain)) ) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showAddForm() { if ($this->selectionActive) return; printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; $this->showCustomerTextBox(); printf ("
SIP domain
"); $this->printHiddenFormElements(); printf (" Import SIP domain from file:
Select file Change Remove
" ); print "
"; } function addRecord($dictionary=array()) { if ($this->adminonly && $_FILES['import_file']['tmp_name']) { $content=fread(fopen($_FILES['import_file']['tmp_name'], "r"), $_FILES['import_file']['size']); //print_r($content); if (!$imported_data=json_decode($content, true)) { printf ("

Error: reading imported data. "); return false; } //print_r($imported_data); if (!in_array('sip_domains', array_keys($imported_data))) { printf ("

Error: Missing SIP domains in imported data. "); return false; } if (!in_array('sip_accounts', array_keys($imported_data))) { return false; printf ("

Error: Missing SIP accounts in imported data. "); } foreach($imported_data['customers'] as $customer) { // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addAccount'); $customer['credit'] = floatval($customer['credit']); $customer['balance'] = floatval($customer['balance']); // Call function $result = $this->SoapEngine->soapclientCustomers->addAccount($customer); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 5001) { $result = $this->SoapEngine->soapclientCustomers->updateCustomer($customer); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); } else { printf('

Customer %s has been updated',$customer['id']); } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); } } else { printf('

Customer %s has been added',$customer['id']); } } foreach($imported_data['sip_domains'] as $domain) { flush(); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addDomain'); $result = $this->SoapEngine->soapclient->addDomain($domain); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 1001) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('updateDomain'); $result = $this->SoapEngine->soapclient->updateDomain($domain); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); } else { printf('

SIP domain %s has been updated',$domain['domain']); } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); } } else { printf('

SIP domain %s has been added',$domain['domain']); } } $i = 0; $added = 0; $updated = 0; $failed = 0; foreach($imported_data['sip_accounts'] as $account) { $i+=1; flush(); $account['callLimit'] = intval($account['callLimit']); $account['prepaid'] = intval($account['prepaid']); $account['quota'] = intval($account['quota']); $account['owner'] = intval($account['owner']); $account['timeout'] = intval($account['timeout']); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addAccount'); $result = $this->SoapEngine->soapclient->addAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 1011) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $result = $this->SoapEngine->soapclient->updateAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); $failed += 1; } else { printf('

%d SIP account %s@%s has been updated',$i,$account['id']['username'], $account['id']['domain']); $updated += 1; } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); $failed += 1; } } else { printf('

%d SIP account %s@%s has been added',$i, $account['id']['username'], $account['id']['domain']); $added += 1; } } if ($added) { printf('

%d SIP accounts added',$added); } if ($updated ) { printf('

%d SIP accounts updated',$updated); } if ($failed) { printf('

%d SIP accounts failed',$failed); } $added = 0; foreach($imported_data['sip_aliases'] as $alias) { flush(); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addAlias'); $result = $this->SoapEngine->soapclient->addAlias($alias); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); printf ("

Error: $log"); } else { $added += 1; } } if ($added) { printf('

%d SIP aliases added',$added); } return true; } else { if ($dictionary['domain']) { $domain = $dictionary['domain']; } else { $domain = trim($_REQUEST['domain']); } list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!$this->validDomain($domain)) { print "Error: invalid domain name"; return false; } $domainStructure = array('domain' => strtolower($domain), 'customer' => intval($customer), 'reseller' => intval($reseller) ); $function=array('commit' => array('name' => 'addDomain', 'parameters' => array($domainStructure), 'logs' => array('success' => sprintf('SIP domain %s has been added',$domain))) ); return $this->SoapEngine->execute($function,$this->html); } } function getRecordKeys() { // Filter $filter=array( 'domain' => $this->filters['domain'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error in getAllowedDomains from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); //return false; } else { foreach ($result->domains as $_domain) { $this->selectionKeys[]=$_domain->domain; } } } function getRecord($domain) { // Filter $filter=array( 'domain' => $domain ); // Range $range=array('start' => 0, 'count' => 1 ); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); dprint_r($Query); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); // Call function $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->domains[0]){ return $result->domains[0]; } else { return false; } } } function showRecord($domain) { if ($domain->certificate and $domain->private_key) { $pemdata = sprintf("%s\n%s", $domain->certificate, $domain->private_key); $cert = openssl_x509_read( $pemdata ); if ($cert) { $cert_data = openssl_x509_parse( $cert ); openssl_x509_free( $cert ); $expire = mktime($cert_data['validTo_time_t']); } else { $cert_data = ""; } } #print("

");
         #print_r($cert_data);
         #print("
"); print ""; print " "; } print " "; $this->showHeader(); $this->chapterTableStart(); $this->showAboveTabs(); $this->showTabs(); $this->showUnderTabs(); $this->showTitleBar(); if (!array_key_exists($this->tab,$this->tabs)) $this->tab="settings"; // show tab $tabFunctionName='show'.ucfirst($this->tab).'Tab'; $this->$tabFunctionName(); $this->showFooter(); $this->chapterTableStop(); } function getDomainOwner ($domain='') { dprint("getdomainOwner($domain)"); if (!$domain) return; // Filter $filter=array('domain' => $domain); // Range $range=array('start' => 0, 'count' => 1 ); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); //dprint_r($Query); // Call function $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { if ($result->domains[0]) { $this->reseller = $result->domains[0]->reseller; $this->customer = $result->domains[0]->customer; } } } function getMobileNumber() { //dprint('getMobileNumber()'); $this->mobile_number=''; if ($this->Preferences['mobile_number']) { $this->mobile_number=$this->Preferences['mobile_number']; } else if ($this->owner_information['mobile']) { $this->mobile_number=$this->owner_information['mobile']; } } function setLanguage() { dprint("setLanguage()"); if ($this->login_type == 'reseller' || $this->login_type == 'customer') { $lang = $this->ResellerLanguage; } else if ($this->login_type == 'subscriber') { if (!$this->Preferences['language']) { foreach (array_keys($this->languages) as $_lang) { if ($this->languages[$_lang]['timezone'] == $this->timezone) { $lang=$_lang; break; } } } $lang = $this->Preferences['language']; } else { $lang = "en"; } //print("Set language to $lang"); $this->changeLanguage($lang); } function getOwnerSettings($owner='') { dprint("getOwnerSettings($owner)"); if (!$owner) { return false; } $this->CustomerPort->addHeader($this->SoapAuthCustomer); $result = $this->CustomerPort->getAccount($owner); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (CustomerPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } $this->owner_information=array( "username" => $result->username, "password" => $result->password, "firstName" => $result->firstName, "lastName" => $result->lastName, "organization" => $result->organization, "timezone" => $result->timezone, "address" => $result->address, "billingAddress" => $result->billingAddress, "city" => $result->city, "state" => $result->state, "country" => $result->country, "postcode" => $result->postcode, "tel" => $result->tel, "enum" => $result->enum, "mobile" => $result->mobile, "fax" => $result->fax, "email" => $result->email, "web" => $result->web ); //dprint_r($this->owner_information); } function getAliases() { // Get Aliases dprint("getAliases()"); $this->aliases=array(); $this->SipPort->addHeader($this->SoapAuth); // Filter $filter=array('targetUsername' => $this->username, 'targetDomain' => $this->domain ); // Range $range=array('start' => 0, 'count' => 20 ); // Order $orderBy = array('attribute' => 'aliasUsername', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $result = $this->SipPort->getAliases($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } //dprint_r($result); foreach ($result->aliases as $_alias) { $this->aliases[]=$_alias->id->username.'@'.$_alias->id->domain; } } function getRatingEntityProfiles() { dprint("getRatingEntityProfiles()"); $this->EntityProfiles=array(); $this->RatingPort->addHeader($this->SoapAuthRating); $entity="subscriber://".$this->username."@".$this->domain; $result = $this->RatingPort->getEntityProfiles($entiry); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (RatingPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } $this->EntityProfiles=$result; } function setAliases() { dprint("setAliases()"); $aliases_new=$_REQUEST['aliases']; $this->getAliases(); $aliases_old=$this->aliases; $addAliases = array_unique(array_diff($aliases_new,$aliases_old)); $deleteAliases = array_unique(array_diff($aliases_old,$aliases_new)); foreach ($addAliases as $_alias) { $_alias=trim(strtolower($_alias)); if (!preg_match("/^[a-z0-9-_.@]+$/i",$_alias)) continue; $els=explode("@",$_alias); if (count($els) ==1 ) { $_alias_username=$_alias; $_alias_domain=$this->domain; } else if (count($els) ==2) { $_alias_username=$els[0]; $_alias_domain=$this->domain; } else { continue ; } $_aliasObject=array("id"=>array("username"=>strtolower($_alias_username), "domain"=>strtolower($_alias_domain) ), "owner"=>intval($this->owner), "target"=>$this->sipId ) ; $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->addAlias($_aliasObject); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } foreach ($deleteAliases as $_alias) { $_alias=trim($_alias); if (!strlen($_alias)) continue; $els=explode("@",$_alias); if (count($els) ==1 ) { $_alias_username=$_alias; $_alias_domain=$this->domain; } else if (count($els) == 2) { $_alias_username=$els[0]; $_alias_domain=$els[1]; } else { continue ; } $_aliasObject=array("username"=>$_alias_username, "domain" =>$_alias_domain ); dprint_r($_aliasObject); dprint("deleteAlias"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->deleteAlias($_aliasObject); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } unset($this->aliases); } function getVoicemail () { dprint("getVoicemail()"); $this->VoicemailPort->addHeader($this->SoapAuthVoicemail); $result = $this->VoicemailPort->getAccount($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "2000" && $error_fault->detail->exception->errorcode != "1010") { printf ("

Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { return true; } } if (!$result->mailbox) { dprint ("No voicemail account found"); return false; } $this->voicemail['Mailbox'] = $result->mailbox; $this->voicemail['Password'] = $result->password; $this->voicemail['Name'] = $result->name; $this->voicemail['Email'] = $result->email; $this->voicemail['Info'] = $result->info; $this->voicemail['Options'] = $result->options; $this->voicemail['Account'] = $result->mailbox.'@'.$this->voicemail_server; // used by template system $this->voicemailMailbox = $result->mailbox; //dprint_r($this->voicemail); return true; } function showTitleBar() { print "

"; printf (("%s <sip:%s@%s>"),$this->fullName,$this->username,$this->domain); print " "; if ($this->login_type == 'subscriber' && !$this->isEmbedded()) { print ""; print _("Logout"); print ""; } else { if ($this->enable_thor) { print " "; if ($this->isEmbedded()) { print " "; print _("Home Node"); } else { print ""; print _("SIP Thor Node"); print ""; } if ($this->homeNode=getSipThorHomeNode($this->account,$this->sip_proxy)) { printf (" %s",$this->homeNode); } else { print " "; print _("Unknown"); print ""; } } } print "
"; } function getDivertTargets () { dprint("getDivertTargets()"); $this->divertTargets[] = array("name" => _("No diversion"), "value" => "", "description" => "Disabled" ); if ($this->voicemail['Account']) { $vmf=$this->getVoicemailForwarding(); if (is_array($vmf)) { $this->divertTargets[]=$vmf; } } if ($this->owner) { if (in_array("free-pstn",$this->groups)) { if ($this->owner_information['tel']) { $tel = preg_replace("/[^\d+]/", "", $this->owner_information['tel']); $tel_enum = str_replace("+", "00", $tel); $telf = $tel_enum . "@" . $this->domain; if (!$seen[$tel_enum] && !in_array($tel_enum,$this->enums)) { $this->divertTargets[]=array("name" => sprintf (_("Tel %s"),$tel), "value" => $telf, "description" => "Tel"); } $seen[$tel_enum]++; } if ($this->owner_information['enum']) { $tel = preg_replace("/[^\d+]/", "", $this->owner_information['enum']); $tel_enum = str_replace("+", "00", $tel); $telf = $tel_enum . "@" . $this->domain; if (!$seen[$tel_enum] && !in_array($tel_enum,$this->enums)) { $this->divertTargets[]=array("name" => sprintf (_("Tel %s"),$tel), "value" => $telf, "description" => "ENUM"); } $seen[$tel_enum]++; } } } if ($this->mobile_number) { $tel = preg_replace("/[^\d+]/", "", $this->mobile_number); $tel_enum = str_replace("+", "00", $tel); $telf = $tel_enum . "@" . $this->domain; if (!$seen[$tel_enum] && !in_array($tel_enum,$this->enums)) { $this->divertTargets[] = array("name" => sprintf (_("Mobile %s"),$tel), "value" => $telf, "description" => "Mobile" ); } $seen[$tel_enum]++; } $this->divertTargets[]=array("name" => sprintf (_("Other")), "value" => "", "description" => "Other" ); //print_r($this->divertTargets); } function pstnChangesAllowed() { dprint("pstnChangesAllowed()"); if ($this->login_type == 'subscriber') { $this->pstn_changes_allowed = false; return; } else { if ($this->login_type == 'admin') { $this->pstn_changes_allowed = true; return; // for a reseller we need to check if a subaccount is allowed } else if ($this->loginCredentials['customer'] == $this->loginCredentials['reseller']) { if ($this->resellerProperties['pstn_changes']) { dprint("is reseller"); $this->pstn_changes_allowed = true; } return; } else if ($this->customerImpersonate == $this->loginCredentials['reseller']) { if ($this->resellerProperties['pstn_changes']) { dprint("impersonate reseller"); $this->pstn_changes_allowed = true; } return; } else if ($this->resellerProperties['pstn_changes'] && $this->customerProperties['pstn_changes']) { $this->pstn_changes_allowed = true; return; } } $this->pstn_changes_allowed = false; return; } function smsChangesAllowed() { dprint("smsChangesAllowed()"); if ($this->login_type == 'subscriber') { $this->sms_changes_allowed = false; return; } else { // for a reseller we need to check if a subaccount is allowed if ($this->loginCredentials['customer'] == $this->loginCredentials['reseller']) { if ($this->resellerProperties['sms_access']) { dprint("is reseller"); $this->sms_changes_allowed = true; } return; } else if ($this->customerImpersonate == $this->loginCredentials['reseller']) { if ($this->resellerProperties['sms_access']) { dprint("impersonate reseller"); $this->sms_changes_allowed = true; } return; } else if ($this->resellerProperties['sms_access'] && $this->customerProperties['sms_access']) { $this->sms_changes_allowed = true; return; } } $this->sms_changes_allowed = false; return; } function prepaidChangesAllowed() { dprint("prepaidChangesAllowed()"); if ($this->login_type == 'subscriber') { $this->prepaid_changes_allowed = false; return; } else { if ($this->login_type == 'admin') { $this->prepaid_changes_allowed = true; return; // for a reseller we need to check if a subaccount is allowed } else if ($this->loginCredentials['customer'] == $this->loginCredentials['reseller']) { dprint("is reseller"); if ($this->resellerProperties['prepaid_changes']) { $this->prepaid_changes_allowed = true; } return; } else if ($this->customerImpersonate == $this->loginCredentials['reseller']) { dprint("impersonate reseller"); if ($this->resellerProperties['prepaid_changes']) { $this->prepaid_changes_allowed = true; } return; } else if ($this->resellerProperties['prepaid_changes'] && $this->customerProperties['prepaid_changes']) { $this->prepaid_changes_allowed = true; return; } } $this->prepaid_changes_allowed = false; return; } function getCustomerSettings () { dprint("getCustomerSettings()"); if (!$this->loginCredentials['customer']) return; $id=$this->loginCredentials['customer']; $this->CustomerPort->addHeader($this->SoapAuthCustomer); $result = $this->CustomerPort->getAccount(intval($this->loginCredentials['customer'])); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (CustomerPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } foreach ($result->properties as $_property) { $this->customerProperties[$_property->name]=$_property->value; } $this->customerImpersonate=$result->impersonate; //dprint_r($this->customerProperties); } function getResellerSettings () { dprint("getResellerSettings()"); $this->logoFile = $this->getFileTemplate("logo","logo"); $this->headerFile = $this->getFileTemplate("header.phtml"); $this->footerFile = $this->getFileTemplate("footer.phtml"); $this->cssFile = $this->getFileTemplate("main.css"); if (!$this->reseller) { if ($this->pstn_access) { $this->availableGroups['free-pstn'] = array( "Group" => "free-pstn", "WEBName" => sprintf(_("PSTN Access")), "WEBComment" => sprintf(_("Caller-ID")), "SubscriberMayEditIt" => 0, "SubscriberMaySeeIt" => 1, "ResellerMayEditIt" => 1, "ResellerMaySeeIt" => 1 ); if ($this->change_privacy_access_number) { $_comment = sprintf(_("Dial %s to change"), $this->change_privacy_access_number); } else { $_comment = ''; } $this->availableGroups['anonymous'] = array( "Group" => "anonymous", "WEBName" => sprintf (_("PSTN Privacy")), "WEBComment" => $_comment, "SubscriberMaySeeIt" => 1, "SubscriberMayEditIt" => 1, "ResellerMayEditIt" => 1, "ResellerMaySeeIt" => 1 ); if ($this->pstn_access) { $this->availableGroups['rate-on-net'] = array("Group"=>"rate-on-net", "WEBName" =>sprintf(_("Rate on net")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>0, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); if ($this->sms_access) { $this->availableGroups['sms'] = array("Group"=>"sms", "WEBName" =>sprintf(_("Mobile SMS")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>1, "ResellerMayEditIt"=>0, "ResellerMaySeeIt"=>1 ); } } if ($this->require_proof_of_identity) { $this->availableGroups['payments'] = array("Group"=>"payments", "WEBName" =>sprintf(_("CC Payments")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>0, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); } } return true; } $this->CustomerPort->addHeader($this->SoapAuthCustomer); $result = $this->CustomerPort->getAccount(intval($this->reseller)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (CustomerPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } foreach ($result->properties as $_property) { $this->resellerProperties[$_property->name]=$_property->value; } $this->resellerProperties['language'] = $result->language; $this->resellerProperties['timezone'] = $result->timezone; // overwrite settings from soap engine if ($this->resellerProperties['sip_proxy']) { $this->sip_proxy = $this->resellerProperties['sip_proxy']; } if ($this->resellerProperties['sip_outbound_proxy']) { $this->sip_outbound_proxy = $this->resellerProperties['sip_outbound_proxy']; } if ($this->resellerProperties['push_notifications_server']) { $this->sip_mobile_outbound_proxy = $this->resellerProperties['push_notifications_server']; } if (!$this->sip_outbound_proxy) { $this->sip_outbound_proxy = $this->sip_proxy; } if (!$this->sip_mobile_outbound_proxy) { $this->sip_mobile_outbound_proxy = $this->sip_outbound_proxy; } if ($this->resellerProperties['store_clear_text_passwords']) { $this->store_clear_text_passwords = $this->resellerProperties['store_clear_text_passwords']; } if ($this->resellerProperties['support_company']) { $this->support_company = $this->resellerProperties['support_company']; } if ($this->resellerProperties['support_web']) { $this->support_web = $this->resellerProperties['support_web']; } if ($this->resellerProperties['support_email']) { $this->support_email = $this->resellerProperties['support_email']; } if ($this->resellerProperties['billing_email']) { $this->billing_email = $this->resellerProperties['billing_email']; } if (!$this->billing_email) { $this->billing_email=$this->support_email; } if ($this->resellerProperties['sip_settings_page']) { $this->sip_settings_page = $this->resellerProperties['sip_settings_page']; } if ($this->resellerProperties['digest_settings_page']) { $this->digest_settings_page = $this->resellerProperties['digest_settings_page']; } if ($this->resellerProperties['xcap_root']) { $this->xcap_root = rtrim($this->resellerProperties['xcap_root'],'/'); if ($this->append_domain_to_xcap_root) { $this->xcap_root .= "@".$this->domain."/"; } } if ($this->resellerProperties['cdrtool_address']) { $this->cdrtool_address = $this->resellerProperties['cdrtool_address']; } if ($this->resellerProperties['msrp_relay']) { $this->msrp_relay = $this->resellerProperties['msrp_relay']; } if (isset($this->resellerProperties['voicemail_server'])) { $this->voicemail_server = $this->resellerProperties['voicemail_server']; } if (isset($this->resellerProperties['voicemail_access_number'])) { $this->voicemail_access_number = $this->resellerProperties['voicemail_access_number']; } if (isset($this->resellerProperties['currency'])) { $this->currency = $this->resellerProperties['currency']; } if (isset($this->resellerProperties['FUNC_access_number'])) { $this->FUNC_access_number = $this->resellerProperties['FUNC_access_number']; } if (isset($this->resellerProperties['FNOA_access_number'])) { $this->FNOA_access_number = $this->resellerProperties['FNOA_access_number']; } if (isset($this->resellerProperties['FBUS_access_number'])) { $this->FBUS_access_number = $this->resellerProperties['FBUS_access_number']; } if (isset($this->resellerProperties['FNOL_access_number'])) { $this->FNOL_access_number = $this->resellerProperties['FNOL_access_number']; } if (isset($this->resellerProperties['payment_processor_class'])) { $this->payment_processor_class = $this->resellerProperties['payment_processor_class']; } if (isset($this->resellerProperties['change_privacy_access_number'])) { $this->change_privacy_access_number = $this->resellerProperties['change_privacy_access_number']; } if (isset($this->resellerProperties['check_privacy_access_number'])) { $this->check_privacy_access_number = $this->resellerProperties['check_privacy_access_number']; } if (isset($this->resellerProperties['reject_anonymous_access_number'])) { $this->reject_anonymous_access_number = $this->resellerProperties['reject_anonymous_access_number']; } if (isset($this->resellerProperties['absolute_voicemail_uri'])) { $this->absolute_voicemail_uri = $this->resellerProperties['absolute_voicemail_uri']; } if (isset($this->resellerProperties['pstn_access'])) { $this->pstn_access = $this->resellerProperties['pstn_access']; } if (isset($this->resellerProperties['sms_access'])) { $this->sms_access = $this->resellerProperties['sms_access']; } if ($this->pstn_access) { $this->availableGroups['free-pstn'] = array("Group"=>"free-pstn", "WEBName" => sprintf(_("PSTN Access")), "WEBComment"=> sprintf(_("Caller-ID")), "SubscriberMayEditIt" => "0", "SubscriberMaySeeIt" => 1, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); if ($this->change_privacy_access_number) { $_comment = sprintf(_("Dial %s to change"), $this->change_privacy_access_number); } else { $_comment = ''; } $this->availableGroups['anonymous'] = array( "Group" => "anonymous", "WEBName" => sprintf (_("PSTN Privacy")), "WEBComment" => $_comment, "SubscriberMaySeeIt" => 1, "SubscriberMayEditIt" => 1, "ResellerMayEditIt" => 1, "ResellerMaySeeIt" => 1 ); $this->availableGroups['rate-on-net'] = array( "Group" => "rate-on-net", "WEBName" => sprintf(_("Rate on net")), "SubscriberMayEditIt" => 0, "SubscriberMaySeeIt" => 0, "ResellerMayEditIt" => 1, "ResellerMaySeeIt" => 1 ); if ($this->sms_access) { $this->availableGroups['sms'] = array("Group"=>"sms", "WEBName" =>sprintf(_("Mobile SMS")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>1, "ResellerMayEditIt"=>0, "ResellerMaySeeIt"=>1 ); } } } function getDiversions() { dprint("getDiversions()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCallDiversions($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } //print_r($result); reset($this->diversionType); foreach(array_keys($this->diversionType) as $condition) { $uri=$result->$condition; if (($uri == "" || $uri == "voice-mailbox") && $this->absolute_voicemail_uri) { $uri = $this->voicemail['Account']; } else if ($uri == "voice-mailbox") { $uri = ""; } if (preg_match("/^(sip:|sips:)(.*)$/i",$uri,$m)) { $uri=$m[2]; } $this->diversions[$condition]=$uri; } //print_r($this->diversions); } function getDeviceLocations() { dprint("getDeviceLocations()"); require_once($this->SipUAImagesFile); $this->userAgentImages = $userAgentImages; $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getSipDeviceLocations(array($this->sipId)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { foreach ($result[0]->locations as $locationStructure) { $contact=$locationStructure->address.":".$locationStructure->port; if ($locationStructure->publicAddress) { $publicContact=$locationStructure->publicAddress.":".$locationStructure->publicPort; } else { $publicContact=$contact; } $this->locations[]=array("contact" => $contact, "publicContact" => $publicContact, "expires" => $locationStructure->expires, "user_agent" => $locationStructure->userAgent, "transport" => $locationStructure->transport ); } } } function getVoicemailForwarding () { dprint("getVoicemailForwarding()"); if (!$this->voicemail['Account']) { return; } if ($this->absolute_voicemail_uri) { $value=$this->voicemail['Account']; } else { $value=""; } return array("name" => sprintf (_("Voice Mailbox")), "value" => $value, "description" => "Voicemail"); } function showAboveTabs() { print "

"; print "
"; } function showTabs() { print "
"; if ($this->isEmbedded()) { print $this->embedded_img;; } print "
    "; $items=0; while (list($k,$v)= each($this->tabs)) { if ($this->tab==$k) { $_class='active selected_tab'; } else { $_class='tabs'; } print "
  • $v
  • "; } print "
"; print "
"; } function showUnderTabs() { print "
"; print "
"; } function addInvoice($cardProcessor) { // called after CC payment sucessfull } function showPaymentsTab() { if (!$this->show_payments_tab) { return false; } if ($this->login_type == 'subscriber' && in_array("blocked",$this->groups)) { return false; } if ($_REQUEST['task'] == 'showprices') { $chapter=sprintf(_("Price list")); $this->showChapter($chapter); include($this->pstn_termination_price_page); return true; } $chapter=sprintf(_("Payments")); $this->showChapter($chapter); if (!$this->owner) { print " "; return false; } $this->getBalanceHistory(); $today_summary = $this->getTodayBalanceSummary(); if ($today_summary['credit'] >= $this->max_credit_per_day) { print " "; return false; } if (!count($this->balance_history)) { $this->first_transaction=true; } else { $this->first_transaction=false; } print " "; $credit_amount = 20; //$method = 'btc'; if ($method == 'btc') { print "

Select an amount and click submit to go the Bitcoin payment page."; printf("
Amount USD

", $this->account); } else { $chapter=sprintf(_("Credit Card")); $this->showChapter($chapter); if ($this->require_proof_of_identity) { if ($this->login_type == 'subscriber') { if (!in_array("payments",$this->groups)) { $this->showIdentityProof(); } } else { $this->showIdentityProof(); } if (!in_array("payments",$this->groups)) { return false; } } $payment_processor = new $this->payment_processor_class($this); if ($payment_processor->fraudDetected()) { $chapter=sprintf(_("Payments")); $this->showChapter($chapter); print "

"; return false; } $basket = array('pstn_credit'=>array('price' => $credit_amount, 'description' => _('Prepaid Credit'), 'unit' => 'credit', 'duration' => 'N/A', 'qty' => 1 ) ); // print "
";
            // print_r($payment_processor);
            // print "
"; $payment_processor->doDirectPayment($basket); //print "
";
             //
             //print_r($payment_processor);
             //print "
"; if ($payment_processor->transaction_results['success']) { // add PSTN credit $this->addBalanceReseller($credit_amount,sprintf("CC transaction %s",$payment_processor->transaction_results['id'])); } if ($this->first_transaction && $payment_processor->make_credit_checks) { // block account temporary to check the user // $transaction_data= $payment_processor->['CardProcessor']['transaction_data']; // if ( $this->email != $transaction_data['USER_EMAIL'] || // $this-> $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->removeFromGroup(array("username" => $this->username,"domain"=> $this->domain),"free-pstn"); } } } function showIdentityProof () { $max_file_size=1024000; $this->db = new DB_CDRTool(); $chapter=sprintf(_("Proof of Identity")); $this->showChapter($chapter); if ($_REQUEST['task'] == 'upload') { if (!$_FILES['tmpfile']['tmp_name']) { print ""; printf (_("Error: Please specify a file")); print ""; } else if (!$_REQUEST['name']) { print ""; printf (_("Error: Please enter the name printed on the Credit Card")); print ""; } else if (!preg_match("/^\d{4}$/",$_REQUEST['last_digits'])) { print ""; printf (_("Error: Last digits must be numeric")); print ""; } else if (!preg_match("/^\+[1-9][0-9]{7,14}$/",$_REQUEST['mobile_number'])) { print ""; printf (_("Error: Mobile Number must be in international format starting with +")); print ""; } else if ($_FILES['tmpfile']['size']['size'] > $max_file_size) { print ""; printf (_("Error: Maximum file size is %s"),$max_file_size); print ""; } else { $fp=fopen($_FILES['tmpfile']['tmp_name'], "r"); $content=fread($fp, $_FILES['tmpfile']['size']); fclose($fp); $query=sprintf("insert into subscriber_docs ( `name`, `username`, `domain`, `document`, `file_content`, `file_name`, `file_size`, `file_type`, `file_date`, `last_digits`, `mobile_number` ) values ( '%s', '%s', '%s', 'identity', '%s', '%s', '%s', '%s', NOW(), '%s', '%s' )", addslashes($_REQUEST['name']), addslashes($this->username), addslashes($this->domain), addslashes($content), addslashes($_FILES['tmpfile']['name']), addslashes($_FILES['tmpfile']['size']), addslashes($_FILES['tmpfile']['type']), addslashes($_REQUEST['last_digits']), addslashes($_REQUEST['mobile_number']) ); if (!$this->db->query($query)) { print ""; printf ("Error: Failed to save identity document %s (%s)", $this->db->Error,$this->db->Errno); print ""; } // send mail include_once('Mail.php'); include_once('Mail/mime.php'); $subject=sprintf ("%s requested CC Payments",$this->account); $hdrs = array( 'From' => $this->email, 'Subject' => $subject ); $crlf = "\n"; $mime = new Mail_mime($crlf); $mime->setTXTBody($subject); $mime->setHTMLBody($subject); $mime->addAttachment($content, $_FILES['tmpfile']['type'],$_FILES['tmpfile']['name'],'false'); $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); $mail->send($this->billing_email, $hdrs, $body); } } if ($this->login_type != 'subscriber' && $_REQUEST['task'] == 'delete_identity_proof' && $_REQUEST['confirm']) { $query=sprintf("delete from subscriber_docs where username = '%s' and domain = '%s' and document = 'identity'", addslashes($this->username), addslashes($this->domain) ); if (!$this->db->query($query)) { print ""; printf ("Error deleting record: %s (%s)", $this->db->Error,$this->db->Errno); print ""; } } $query=sprintf("select * from subscriber_docs where username = '%s' and domain = '%s' and document = 'identity'", addslashes($this->username), addslashes($this->domain) ); if (!$this->db->query($query)) { print ""; printf ("Error for database query: %s (%s)", $this->db->Error,$this->db->Errno); print ""; } if ($this->db->num_rows()) { print "
"; printf ("",$_SERVER['PHP_SELF']); print ""; print ""; if ($cert_data) { // Parse the resource and print out the contents. $ts = $cert_data['validTo_time_t']; $expire = new DateTime("@$ts"); printf("", $cert_data['subject']['CN']); printf("", $cert_data['issuer']['C'], $cert_data['issuer']['O'], $cert_data['issuer']['CN']);; printf("", $expire->format('Y-m-d')); } if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { if ($this->FieldsAdminOnly[$item]['name']) { $item_name=$this->FieldsAdminOnly[$item]['name']; } else { $item_name=preg_replace("/_/"," ",ucfirst($item)); } if ($this->FieldsAdminOnly[$item]['type'] == 'text') { printf ("", $item_name, $item, $domain->$item ); } else if ($this->FieldsAdminOnly[$item]['type'] == 'boolean') { if ($domain->$item == 1) { $checked = "checked"; } else { $checked = ""; } printf ("", $item_name, $item, $checked ); } else { printf ("", $item_name, $item, $domain->$item ); } } } foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name = preg_replace("/_/"," ",ucfirst($item)); } if ($this->Fields[$item]['type'] == 'text') { printf ("", $item_name, $item, $domain->$item ); } else if ($this->Fields[$item]['type'] == 'boolean') { if ($domain->$item == 1) { $checked = "checked"; } else { $checked = ""; } printf ("", $item_name, $item, $checked ); } else { printf ("", $item_name, $item, $domain->$item ); } } printf ("",$domain->domain); $this->printFiltersToForm(); $this->printHiddenFormElements(); print ""; print "
TLS CN%s
CA Issuer%s %s %s
Expire date%s
%s
%s
%s
%s
%s
%s
"; } function updateRecord () { //print "

Updating domain ..."; if (!$_REQUEST['domain_filter']) return false; if (!$domain = $this->getRecord($_REQUEST['domain_filter'])) { return false; } $domain_old=$domain; foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $domain->$item = intval($_REQUEST[$var_name] == 1); } else if ($this->Fields[$item]['type'] == 'boolean') { $domain->$item = intval($_REQUEST[$var_name]); } else { $domain->$item = trim($_REQUEST[$var_name]); } } if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->FieldsAdminOnly[$item]['type'] == 'integer') { $domain->$item = intval($_REQUEST[$var_name]); } else if ($this->Fields[$item]['type'] == 'boolean') { $domain->$item = intval($_REQUEST[$var_name]); } else { $domain->$item = trim($_REQUEST[$var_name]); } } } $function=array('commit' => array('name' => 'updateDomain', 'parameters' => array($domain), 'logs' => array('success' => sprintf('Domain %s has been updated',$domain->domain))) ); return $this->SoapEngine->execute($function,$this->html); } function hide_html() { if ($_REQUEST['action'] == 'Export') { return true; } else { return false; } } function exportDomain($domain) { $exported_data= array(); // Filter $filter=array( 'domain' => $domain, 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 1000 ); // Compose query $Query=array('filter' => $filter, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $i = 0 ; while ($i < $result->total) { $domain = $result->domains[$i]; if (!in_array($domain->customer, $export_customers)) { $export_customers[]=$domain->customer; } if (!in_array($domain->reseller, $export_customers)) { $export_customers[]=$domain->reseller; } $i+=1; $exported_data['sip_domains'][] = objectToArray($domain); } } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccounts'); // Call function $result = call_user_func_array(array($this->SoapEngine->soapclient,'getAccounts'),array($Query)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $exported_data['sip_accounts'] = objectToArray($result->accounts); foreach ($result->accounts as $account) { if (!in_array($account->owner, $export_customers)) { $export_customers[]=$account->owner; } $sipId=array("username" => $account->id->username, "domain" => $account->id->domain ); $this->SoapEngine->soapclientVoicemail->addHeader($this->SoapEngine->SoapAuthVoicemail); $result = $this->SoapEngine->soapclientVoicemail->getAccount($sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "2000" && $error_fault->detail->exception->errorcode != "1010") { printf ("

Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); } } else { $exported_data['voicemail_accounts'][] = $result; } // Filter $filter=array('targetUsername' => $account->id->username, 'targetDomain' => $account->id->domain ); // Range $range=array('start' => 0, 'count' => 20 ); // Compose query $Query=array('filter' => $filter, 'range' => $range ); // Call function $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAliases'); $result = $this->SoapEngine->soapclient->getAliases($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); } else { foreach ($result->aliases as $alias) { $exported_data['sip_aliases'][] = objectToArray($alias); } } } } foreach ($export_customers as $customer) { if (!$customer) { continue; } $filter=array( 'customer' => intval($customer), ); // Compose query $Query=array('filter' => $filter ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getCustomers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $exported_data['customers'] = objectToArray($result->accounts); } } //print_r($exported_data['customers']); print_r(json_encode($exported_data)); } } class SipAccounts extends Records { var $selectionActiveExceptions=array('domain'); var $sortElements=array('changeDate' => 'Change date', 'username' => 'Username', 'domain' => 'Domain' ); var $store_clear_text_passwords=true; var $default_account_type = 'postpaid'; var $group_filter_list = array('blocked' => 'Blocked', 'quota' => 'Quota Exceeded', 'prepaid' => 'Prepaid', 'free-pstn' => 'PSTN Access', 'anonymous' => 'Anonymous', 'anonymous-reject' => 'Reject Anonymous', 'voicemail' => 'Has Voicemail', 'missed-calls' => 'Missed Calls', 'trunking' => 'Trunking' ); function SipAccounts($SoapEngine) { dprint("init SipAccounts"); $this->filters = array('username' => strtolower(trim($_REQUEST['username_filter'])), 'domain' => strtolower(trim($_REQUEST['domain_filter'])), 'firstname'=> trim($_REQUEST['firstname_filter']), 'lastname' => trim($_REQUEST['lastname_filter']), 'email' => trim($_REQUEST['email_filter']), 'owner' => trim($_REQUEST['owner_filter']), 'customer' => trim($_REQUEST['customer_filter']), 'reseller' => trim($_REQUEST['reseller_filter']), 'group' => trim($_REQUEST['group_filter']) ); $this->Records($SoapEngine); if (strlen($this->SoapEngine->call_limit)) { $this->platform_call_limit = $this->SoapEngine->call_limit; } else { $this->platform_call_limit; } $this->getTimezones(); } function getRecordKeys() { if (preg_match("/^(.*)@(.*)$/",$this->filters['username'],$m)) { $this->filters['username'] = $m[1]; $this->filters['domain'] = $m[2]; } // Filter $filter=array('username' => $this->filters['username'], 'domain' => $this->filters['domain'], 'firstName'=> $this->filters['firstname'], 'lastName' => $this->filters['lastname'], 'email' => $this->filters['email'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']), 'groups' => array($this->filters['group']) ); // Range $range=array('start' => 0, 'count' => 500 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccounts'); // Call function $result = $this->SoapEngine->soapclient->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->accounts as $account) { $this->selectionKeys[]=array('username' => $account->id->username, 'domain' => $account->id->domain ); } return true; } return false; } function listRecords() { $this->getAllowedDomains(); if (preg_match("/^(.*)@(.*)$/",$this->filters['username'],$m)) { $this->filters['username'] = $m[1]; $this->filters['domain'] = $m[2]; } $this->showSeachForm(); // Filter $filter=array('username' => $this->filters['username'], 'domain' => $this->filters['domain'], 'firstName'=> $this->filters['firstname'], 'lastName' => $this->filters['lastname'], 'email' => $this->filters['email'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']), 'groups' => array($this->filters['group']) ); $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credentials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccounts'); // Call function $result = $this->SoapEngine->soapclient->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $action != 'PerformActions' && $action != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } if ($this->rows) { $i=0; $_prepaid_accounts=array(); while ($i < $maxrows) { if (!$result->accounts[$i]) break; $account = $result->accounts[$i]; if ($account->prepaid) { $_prepaid_accounts[]=array("username" => $account->id->username, "domain" => $account->id->domain ); } $i++; } if (count($_prepaid_accounts)) { // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getPrepaidStatus'); // Call function $result1 = $this->SoapEngine->soapclient->getPrepaidStatus($_prepaid_accounts); if (!(new PEAR)->isError($result1)) { $j=0; foreach ($result1 as $_account) { $_sip_account=sprintf("%s@%s",$_prepaid_accounts[$j]['username'],$_prepaid_accounts[$j]['domain']); $_prepaid_balance[$_sip_account]=$_account->balance; $j++; } } } $i=0; while ($i < $maxrows) { if (!$result->accounts[$i]) break; $account = $result->accounts[$i]; $index=$this->next+$i+1; $_url = $this->url.'&'.$this->addFiltersToURL().sprintf("&service=%s&action=Delete", urlencode($this->SoapEngine->service) ); if (!$this->filters['domain']) { $_url .= sprintf("&domain_filter=%s",urlencode($account->id->domain)); } if (!$this->filters['username']) { $_url .= sprintf("&username_filter=%s",urlencode($account->id->username)); } $_url.= sprintf("&key=%s",urlencode($account->id->username)); if ($action == 'Delete' && $_REQUEST['key'] == $account->id->username && $_REQUEST['domain_filter'] == $account->id->domain) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } if ($account->reseller) { $reseller_sip_settings_page=$account->reseller; } else if ($this->SoapEngine->impersonate) { // use the reseller from the soap engine $reseller_sip_settings_page=$this->SoapEngine->impersonate; } else { // use the reseller from the login $reseller_sip_settings_page=$this->reseller; } if ($this->sip_settings_page) { $url=sprintf('%s?account=%s@%s&sip_engine=%s', $this->sip_settings_page,urlencode($account->id->username),$account->id->domain,$this->SoapEngine->sip_engine); if ($this->adminonly) { $url .= sprintf('&reseller=%s',$reseller_sip_settings_page); $url .= sprintf('&adminonly=%s',$this->adminonly); } else { if ($account->reseller == $this->reseller) $url .= sprintf('&reseller=%s',$reseller_sip_settings_page); } foreach (array_keys($this->SoapEngine->extraFormElements) as $element) { if (!strlen($this->SoapEngine->extraFormElements[$element])) continue; $url .= sprintf('&%s=%s',$element,urlencode($this->SoapEngine->extraFormElements[$element])); } $sip_account=sprintf(" %s@%s",$url,$account->id->username,$account->id->domain); } else { $sip_account=sprintf("%s@%s",$account->id->username,$account->id->domain); } /* $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($account->customer)); */ if ($account->owner) { $_owner_url = sprintf ("%s", $this->url, urlencode($this->SoapEngine->soapEngine), urlencode($account->owner), $account->owner ); } else { $_owner_url=''; } $prepaid_account=sprintf("%s@%s",$account->id->username,$account->id->domain); if ($account->callLimit) { $callLimit = $account->callLimit; } else if ($this->platform_call_limit) { $callLimit = $this->platform_call_limit; } else { $callLimit = ''; } printf(" ", $index, $sip_account, $account->firstName, $account->lastName, $account->email, $account->email, $account->timezone, $callLimit, $account->quota, $_prepaid_balance[$prepaid_account], $_owner_url, $account->changeDate, $_url, $actionText ); $i++; } } print "
Id SIP account"; $this->showSortCaret('username'); if ($this->sorting['sortBy'] == 'domain' ) { print " (domain "; $this->showSortCaret('domain'); print ")"; } print " Full name Email address Timezone Capacity Quota Balance Owner Change date"; $this->showSortCaret('changeDate'); print " Actions
%s %s %s %s %s %s %s %s %s %s %s %s
"; $this->showPagination($maxrows); return true; } } function showSeachFormCustom() { printf ("

Account
",$this->filters['username']); printf ("@"); if (count($this->allowedDomains) > 0) { if ($this->filters['domain'] && !in_array($this->filters['domain'],$this->allowedDomains)) { printf ("",$this->filters['domain']); } else { $selected_domain[$this->filters['domain']]='selected'; printf ("\n"); } } else { printf ("",$this->filters['domain']); } printf ("
FN
\n",$this->filters['firstname']); printf ("
LN
\n",$this->filters['lastname']); printf ("
Email
\n",$this->filters['email']); printf ("
Owner
\n",$this->filters['owner']); $selected_group[$this->filters['group']]='selected'; print ""; } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['username']) { $username=$dictionary['username']; } else { $username=$_REQUEST['key']; } if ($dictionary['domain']) { $domain=$dictionary['domain']; } else { $domain=$this->filters['domain']; } if (!strlen($username) || !strlen($domain)) { print "

Error: missing SIP account username or domain. "; return false; } $account=array('username' => $username, 'domain' => $domain ); $function=array('commit' => array('name' => 'deleteAccount', 'parameters' => array($account), 'logs' => array('success' => sprintf('SIP account %s@%s has been deleted',$_REQUEST['key'],$this->filters['domain']) ) ) ); foreach (array_keys($this->filters) as $_filter) { if ($_filter == 'username' || $_filter == 'domain') continue; $new_filters[$_filter]=$this->filters[$_filter]; } $this->filters=$new_filters; return $this->SoapEngine->execute($function,$this->html); } function showAddForm() { if ($this->filters['username']) return; if (!count($this->allowedDomains)) { print "

You must create at least one SIP domain before adding SIP accounts
"; return false; } printf ("
",$_SERVER['PHP_SELF']); print "
"; print " "; if ($_REQUEST['account']) { $_account=$_REQUEST['account']; } else { $_account=$this->getCustomerProperty('sip_accounts_last_username'); } printf ("
Account
",$_account); if ($_REQUEST['domain']) { $_domain=$_REQUEST['domain']; $selected_domain[$_REQUEST['domain']]='selected'; } else if ($this->filters['domain']) { $_domain=$this->filters['domain']; $selected_domain[$this->filters['domain']]='selected'; } else if ($_domain=$this->getCustomerProperty('sip_accounts_last_domain')) { $selected_domain[$_domain]='selected'; } if (count($this->allowedDomains) > 0) { print "@"; } else { printf (" ",$_domain); } if ($_REQUEST['quota']) { $_quota=$_REQUEST['quota']; } else { $_quota=$this->getCustomerProperty('sip_accounts_last_quota'); } if (!$_quota) $_quota=''; if ($_prepaid=$this->getCustomerProperty('sip_accounts_last_prepaid')) { $checked_prepaid='checked'; } else { $checked_prepaid=''; } if ($_pstn=$this->getCustomerProperty('sip_accounts_last_pstn')) { $checked_pstn='checked'; } else { $checked_pstn=''; } printf ("
Password
",$_REQUEST['password']); printf ("
Name
",$_REQUEST['fullname']); printf ("
Email
",$_REQUEST['email']); printf ("
Owner
",$_REQUEST['owner']); if ($this->getResellerProperty('pstn_access')) { printf (" PSTN ",$checked_pstn); printf ("
Quota
",$_quota); if ($this->prepaidChangesAllowed()) { printf (" Prepaid ",$checked_prepaid); } else { printf (" Prepaid "); } } $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { dprint_r($dictionary); if ($dictionary['account']) { $account_els = explode("@", $dictionary['account']); $this->skipSaveProperties=true; } else { $account_els = explode("@", trim($_REQUEST['account'])); } list($customer,$reseller)=$this->customerFromLogin($dictionary); $username=$account_els[0]; if (strlen($account_els[1])) { $domain=$account_els[1]; } else if ($dictionary['domain']) { $domain=$dictionary['domain']; } else if ($_REQUEST['domain']) { $domain=trim($_REQUEST['domain']); } else { printf ("

Error: Missing SIP domain"); return false; } if (!$this->validDomain($domain)) { print "Error: invalid domain name"; return false; } if ($dictionary['fullname']) { $name_els = explode(" ", $dictionary['fullname']); } else { $name_els = explode(" ", trim($_REQUEST['fullname'])); } if (strlen($name_els[0])) { $firstName=$name_els[0]; } else { $firstName='Account'; } if (strlen($name_els[1])) { $j=1; while ($j < count($name_els)) { $lastName .= $name_els[$j].' '; $j++; } } else { if ($username=="") { $lastName="Unknown"; } else { $lastName=$username; } } $lastName=trim($lastName); if (strlen($dictionary['timezone'])) { $timezone=$dictionary['timezone']; } else if (strlen(trim($_REQUEST['timezone']))) { $timezone=trim($_REQUEST['timezone']); } else if ($this->SoapEngine->default_timezone) { $timezone=$this->SoapEngine->default_timezone; } else { $timezone='Europe/Amsterdam'; } if (!in_array($timezone,$this->timezones)) { $timezone='Europe/Amsterdam'; } if (strlen($dictionary['password'])) { $password=$dictionary['password']; } else if (strlen(trim($_REQUEST['password']))) { $password=trim($_REQUEST['password']); } else { $password=$this->RandomString(10); } if (is_array($dictionary['groups'])) { $groups=$dictionary['groups']; } else { $groups=array(); } if (is_array($dictionary['ip_access_list'])) { $ip_access_list=$dictionary['ip_access_list']; } else { $ip_access_list=array(); } if (strlen($dictionary['call_limit'])) { $call_limit=$dictionary['call_limit']; } else { $call_limit=$_REQUEST['call_limit']; } if($dictionary['pstn'] || $_REQUEST['pstn']) { $_pstn=1; $groups[]='free-pstn'; } else { $_pstn=0; } if (strlen($dictionary['email'])) { $email=$dictionary['email']; } else { $email=trim($_REQUEST['email']); } if (strlen($dictionary['rpid'])) { $rpid=$dictionary['rpid']; } else { $rpid=trim($_REQUEST['rpid']); } if (strlen($dictionary['owner'])) { $owner=intval($dictionary['owner']); } else { $owner=intval($_REQUEST['owner']); } if (!$owner) { $owner = intval($customer); } if (strlen($dictionary['quota'])) { $quota=intval($dictionary['quota']); } else { $quota=intval($_REQUEST['quota']); } if ($this->prepaidChangesAllowed()) { if (strlen($dictionary['prepaid'])) { $prepaid=intval($dictionary['prepaid']); } else { $prepaid=intval($_REQUEST['prepaid']); } } else { $prepaid = 1; } if ($prepaid) { $groups[]='prepaid'; } if (!$email) { if ($username=="") { $email='unknown@'.strtolower($domain); } else { $email=strtolower($username).'@'.strtolower($domain); } } if (!$this->skipSaveProperties) { $_p=array( array('name' => 'sip_accounts_last_domain', 'category' => 'web', 'value' => "$domain", 'permission' => 'customer' ), array('name' => 'sip_accounts_last_username', 'category' => 'web', 'value' => "$username", 'permission' => 'customer' ), array('name' => 'sip_accounts_last_timezone', 'category' => 'web', 'value' => "$timezone", 'permission' => 'customer' ), array('name' => 'sip_accounts_last_quota', 'category' => 'web', 'value' => "$quota", 'permission' => 'customer' ), array('name' => 'sip_accounts_last_pstn', 'category' => 'web', 'value' => "$_pstn", 'permission' => 'customer' ), array('name' => 'sip_accounts_last_prepaid', 'category' => 'web', 'value' => "$prepaid", 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); } if (is_array($dictionary['properties'])) { $properties=$dictionary['properties']; } else { $properties=array(); } if ($this->SoapEngine->login_credentials['reseller']) { $reseller_properties=$this->getResellerProperties($this->SoapEngine->login_credentials['reseller'],'store_clear_text_passwords'); if (strlen($reseller_properties['store_clear_text_passwords'])) { $this->store_clear_text_passwords=$reseller_properties['store_clear_text_passwords']; } } else { $_reseller=$this->getResellerForDomain(strtolower($domain)); if ($_reseller) { $reseller_properties=$this->getResellerProperties($_reseller,'store_clear_text_passwords'); if (strlen($reseller_properties['store_clear_text_passwords'])) { $this->store_clear_text_passwords=$reseller_properties['store_clear_text_passwords']; } } } if ($this->store_clear_text_passwords || $username == '') { $password_final=$password; } else { $md1=strtolower($username).':'.strtolower($domain).':'.$password; $md2=strtolower($username).'@'.strtolower($domain).':'.strtolower($domain).':'.$password; $password_final=md5($md1).':'.md5($md2); } $account=array( 'id' => array('username' => strtolower($username), 'domain' => strtolower($domain) ), 'firstName' => $firstName, 'lastName' => $lastName, 'password' => $password_final, 'timezone' => $timezone, 'email' => strtolower($email), 'owner' => $owner, 'rpid' => $rpid, 'groups' => $groups, 'prepaid' => $prepaid, 'quota' => $quota, 'acl' => $ip_access_list, 'properties' => $properties ); if (isset($call_limit)) { $account['callLimit'] = intval($call_limit); } //print_r($account); $deleteAccount=array('username' => $username, 'domain' => $domain); if ($this->html) { if ($username == '') { $success_log=sprintf('SIP account has been generated in domain %s',$domain); } else { $success_log=sprintf('SIP account %s@%s has been added',$username,$domain); } } $function=array('commit' => array('name' => 'addAccount', 'parameters' => array($account), 'logs' => array('success' => $success_log)) ); return $this->SoapEngine->execute($function,$this->html); } function getAllowedDomains() { // Filter $filter = array( 'domain' => '' ); // Range $range = array( 'start' => 0, 'count' => 750 ); $orderBy = array( 'attribute' => 'domain', 'direction' => 'ASC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error in getAllowedDomains from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); //return false; } else { foreach ($result->domains as $_domain) { if ($this->validDomain($_domain->domain)) { $this->allowedDomains[] = $_domain->domain; } } } } function showPasswordReminderForm($accounts=array()) { printf ("

"); print _("Login account reminder"); print "

"; print _("

Fill in the e-mail address used during the registration of the SIP account:

"); printf (" "; if (count($accounts) > 1 || $_REQUEST['sip_filter']) { printf ("

"); print _("Warning"); print " "; print _("More than one account uses this email address. If you wish to receive the password for a particular account fill in the SIP account below, default it has been send it to the first 5 accounts found"); print "
"; printf (" ", $_REQUEST['sip_filter']); } printf ("
"); } function showPasswordReminderUpdateFormEncrypted($id, $account) { if ($account) { printf ("

"); print _("Update passwords"); print ""; print " (for "; print $account; print ")

"; print _("

Please choose new passwords for your account, if you leave them empty no change will be performed

"); print "
"; print "
"; print "
"; print ""; print "
"; print ""; print ""; print "
"; print "
"; print ""; print "
"; print ""; print ""; print "
"; print "
"; printf ("
"); } } function showPasswordReminderFormEncrypted($accounts=array()) { printf ("

"); print _("Sip Account Reminder/Password Reset"); print "

"; //print _("

Please fill in the SIP account and e-mail address used during the registration of the SIP account to receive a login reminder and a possiblity to reset your passwords.

"); if (count($accounts) < 1 && $_REQUEST['sip_filter'] && $_REQUEST['email_filter']) { printf ("
"); print _("Error"); print "
"; print _("The email adress does not match email address in the SIP account, or the SIP account does not exist."); print "
"; print _("An email has not been sent."); print "
"; } else if(count($accounts) < 1 && $_REQUEST['email_filter']) { printf ("
"); print _("Error"); print ": "; print _("The email adress does not match the email address in any SIP account."); print "
"; print _("An email has not been sent."); print "
"; } print " "; print ""; print ""; printf ("
"); if(count($accounts) < 1 && $_REQUEST['sip_filter']) { print ""; } } function getAccountsForPasswordReminderEncrypted($maximum_accounts=5) { $accounts=array(); //$filter = array('email' => $this->filters['email']); if ($_REQUEST['sip_filter']) { list($username,$domain)=explode('@',trim($_REQUEST['sip_filter'])); if ($username && $domain) { $filter = array('username' => $username, 'domain' => $domain, 'email' => $this->filters['email'] ); } } else { $filter = array('email' => $this->filters['email']); } $range = array('start' => 0, 'count' => $maximum_accounts); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC'); $Query = array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccounts'); $result = $this->SoapEngine->soapclient->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); } else { $i=0; while ($i < $result->total) { if (!$result->accounts[$i]) break; $account = $result->accounts[$i]; $accounts[]=array('username'=> $account->id->username, 'domain' => $account->id->domain ); $i++; } } return $accounts; } function getAccountsForPasswordReminder($maximum_accounts=5) { $accounts=array(); $filter = array('email' => $this->filters['email']); if ($_REQUEST['sip_filter']) { list($username,$domain)=explode('@',trim($_REQUEST['sip_filter'])); if ($username && $domain) { $filter = array( 'username' => $username, 'domain' => $domain ); } } $range = array('start' => 0, 'count' => $maximum_accounts); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC'); $Query = array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccounts'); $result = $this->SoapEngine->soapclient->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); } else { $i=0; while ($i < $result->total) { if (!$result->accounts[$i]) break; $account = $result->accounts[$i]; $accounts[]=array('username'=> $account->id->username, 'domain' => $account->id->domain ); $i++; } } return $accounts; } function getResellerForDomain($domain='') { // Filter $filter=array( 'domain' => $domain ); // Range $range=array('start' => 0, 'count' => 1 ); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); // Call function $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->domains[0]){ return $result->domains[0]->reseller; } else { return false; } } } function getResellerProperties($reseller='',$property='') { $properties=array(); if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!$reseller) { dprint ("No customer provided"); return true; } if (!$property) { dprint ("No property provided"); return true; } $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $result = $this->SoapEngine->soapclientCustomers->getProperties(intval($reseller)); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } foreach ($result as $_property) { $properties[$_property->name]=$_property->value; } return $properties; } function pstnChangesAllowed() { //dprint_r($this->loginProperties); $_customer_pstn_changes=$this->getCustomerProperty('pstn_changes'); $_reseller_pstn_changes=$this->getCustomerProperty('pstn_changes'); if ($this->adminonly) { return true; } else if ($this->customer == $this->reseller && $_reseller_pstn_changes) { return true; } else if ($this->loginImpersonate == $this->reseller && $_reseller_pstn_changes) { return true; } else if ($_reseller_pstn_changes && $_customer_pstn_changes) { return true; } return false; } function prepaidChangesAllowed() { //dprint_r($this->loginProperties); $_customer_prepaid_changes=$this->getCustomerProperty('prepaid_changes'); $_reseller_prepaid_changes=$this->getCustomerProperty('prepaid_changes'); if ($this->adminonly) { return true; } else if ($this->customer == $this->reseller && $_reseller_prepaid_changes) { return true; } else if ($this->loginImpersonate == $this->reseller && $_reseller_prepaid_changes) { return true; } else if ($_reseller_prepaid_changes && $_customer_prepaid_changes) { return true; } return false; } function getTimezones () { $this->timezones=array(); if (!$fp = fopen("timezones", "r")) { print _("Failed to open timezone file."); return false; } while ($buffer = fgets($fp,1024)) { $this->timezones[]=trim($buffer); } fclose($fp); } function showTextBeforeCustomerSelection() { print _("Domain owner"); } } class SipAliases extends Records { var $selectionActiveExceptions=array('alias_domain'); function SipAliases($SoapEngine) { dprint("init SipAliases"); $target_filters_els=explode("@",trim($_REQUEST['target_username_filter'])); $target_username=$target_filters_els[0]; if (count($target_filters_els) > 1) { $target_domain=$target_filters_els[1]; } $this->filters = array('alias_username' => strtolower(trim($_REQUEST['alias_username_filter'])), 'alias_domain' => strtolower(trim($_REQUEST['alias_domain_filter'])), 'target_username' => strtolower($target_username), 'target_domain' => strtolower($target_domain) ); $this->Records($SoapEngine); $this->sortElements=array( 'changeDate' => 'Change date', 'aliasUsername' => 'Alias user', 'aliasDomain' => 'Alias domain', 'targetUsername' => 'Target user', 'targetDomain' => 'Target domain', ); } function getRecordKeys() { // Filter $filter=array('aliasUsername' => $this->filters['alias_username'], 'aliasDomain' => $this->filters['alias_domain'], 'targetUsername' => $this->filters['target_username'], 'targetDomain' => $this->filters['target_domain'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 500 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'aliasUsername'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); //dprint_r($Query); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAliases'); // Call function $result = $this->SoapEngine->soapclient->getAliases($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->aliases as $alias) { $this->selectionKeys[]=array('username' => $alias->id->username, 'domain' => $alias->id->domain); } return true; } } function listRecords() { $this->getAllowedDomains(); // Make sure we apply the domain filter from the login credetials $this->showSeachForm(); // Filter $filter=array('aliasUsername' => $this->filters['alias_username'], 'aliasDomain' => $this->filters['alias_domain'], 'targetUsername' => $this->filters['target_username'], 'targetDomain' => $this->filters['target_domain'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAliases'); // Call function $result = $this->SoapEngine->soapclient->getAliases($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->aliases[$i]) break; $alias = $result->aliases[$i]; $index=$this->next+$i+1; $_url = $this->url.sprintf("&service=%s&action=Delete&alias_username_filter=%s&alias_domain_filter=%s", urlencode($this->SoapEngine->service), urlencode($alias->id->username), urlencode($alias->id->domain) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['alias_username_filter'] == $alias->id->username && $_REQUEST['alias_domain_filter'] == $alias->id->domain) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } /* $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($alias->customer) ); */ $_sip_accounts_url = $this->url.sprintf("&service=sip_accounts@%s&username_filter=%s&domain_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($alias->target->username), urlencode($alias->target->domain) ); if ($alias->owner) { $_owner_url = sprintf ("%s", $this->url, urlencode($this->SoapEngine->soapEngine), urlencode($alias->owner), $alias->owner ); } else { $_owner_url=''; } printf(" ", $index, $alias->id->username, $alias->id->domain, $_sip_accounts_url, $alias->target->username, $alias->target->domain, $_owner_url, $alias->changeDate, $_url, $actionText ); $i++; } } print "
Id SIP alias Redirect target Owner Change date Actions
%s %s@%s %s@%s %s %s %s
"; $this->showPagination($maxrows); /* $_properties=array( array('name' => $this->SoapEngine->port.'_sortBy', 'value' => $this->sorting['sortBy'], 'permission' => 'customer', 'category' => 'web' ), array('name' => $this->SoapEngine->port.'_sortOrder', 'value' => $this->sorting['sortOrder'], 'permission' => 'customer', 'category' => 'web' ) ); print_r($_properties); $this->setCustomerProperties($_properties); */ return true; } } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['alias_username']) { $alias_username=$dictionary['alias_username']; } else { $alias_username=$this->filters['alias_username']; } if ($dictionary['alias_domain']) { $alias_domain=$dictionary['alias_domain']; } else { $alias_domain=$this->filters['alias_domain']; } if (!strlen($alias_username) || !strlen($alias_domain)) { print "

Error: missing SIP alias username or domain. "; return false; } $alias=array('username' => $alias_username, 'domain' => $alias_domain ); $function=array('commit' => array('name' => 'deleteAlias', 'parameters' => array($alias), 'logs' => array('success' => sprintf('SIP alias %s@%s has been deleted',$this->filters['alias_username'],$this->filters['alias_domain']) ) ) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

SIP alias
",$this->filters['alias_username']); printf ("@"); if (count($this->allowedDomains) > 0) { if ($this->filters['alias_domain'] && !in_array($this->filters['alias_domain'],$this->allowedDomains)) { printf ("",$this->filters['alias_domain']); } else { $selected_domain[$this->filters['alias_domain']]='selected'; printf (""); } } else { printf ("",$this->filters['alias_domain']); } printf ("
Redirect target
",trim($_REQUEST['target_username_filter'])); printf ("
Owner
",$this->filters['owner']); } function showAddForm() { if ($this->selectionActive) return; if (!count($this->allowedDomains)) { print "

You must create at least one SIP domain before adding SIP aliases"; return false; } printf ("

",$_SERVER['PHP_SELF']); print "
"; printf ("
SIP alias
"); if ($_REQUEST['domain']) { $_domain=$_REQUEST['domain']; $selected_domain[$_REQUEST['domain']]='selected'; } else if ($_domain=$this->getCustomerProperty('sip_aliases_last_domain')) { $selected_domain[$_domain]='selected'; } if (count($this->allowedDomains) > 0) { print "@"; } else { printf (" ",$_domain); } printf ("
Redirect target
"); printf ("
Owner
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['alias']) { $alias_els = explode("@", $dictionary['alias']); $this->skipSaveProperties=true; } else { $alias_els = explode("@", trim($_REQUEST['alias'])); } if ($dictionary['target']) { $target_els = explode("@", $dictionary['target']); } else { $target_els = explode("@", trim($_REQUEST['target'])); } if ($dictionary['owner']) { $owner = $dictionary['owner']; } else { $owner = $_REQUEST['owner']; } if (preg_match("/:(.*)$/",$target_els[0],$m)) { $target_username=$m[1]; } else { $target_username=$target_els[0]; } if (preg_match("/:(.*)$/",$alias_els[0],$m)) { $username=$m[1]; } else { $username=$alias_els[0]; } if (strlen($alias_els[1])) { $domain=$alias_els[1]; } else if (trim($_REQUEST['domain'])) { $domain=trim($_REQUEST['domain']); } else { if ($this->html) { printf ("

Error: Missing SIP domain"); } return false; } if (!$this->validDomain($domain)) { if ($this->html) { print "Error: invalid domain name"; } return false; } list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!$this->skipSaveProperties=true) { $_p=array( array('name' => 'sip_aliases_last_domain', 'category' => 'web', 'value' => strtolower($domain), 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); } $alias=array( 'id' => array('username' => strtolower($username), 'domain' => strtolower($domain) ), 'target' => array('username' => strtolower($target_username), 'domain' => strtolower($target_els[1]) ), 'owner' => intval($owner) ); $deleteAlias=array('username' => strtolower($username), 'domain' => strtolower($domain) ); $function=array('commit' => array('name' => 'addAlias', 'parameters' => array($alias), 'logs' => array('success' => sprintf('SIP alias %s@%s has been added',$username,$domain))) ); return $this->SoapEngine->execute($function,$this->html); } function getAllowedDomains() { // Filter $filter=array( 'domain' => '' ); // Range $range=array('start' => 0, 'count' => 500 ); $orderBy = array('attribute' => 'domain', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getDomains'); $result = $this->SoapEngine->soapclient->getDomains($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->domains as $_domain) { if ($this->validDomain($_domain->domain)) { $this->allowedDomains[]=$_domain->domain; } } } } function showTextBeforeCustomerSelection() { print _("Domain owner"); } } class EnumRanges extends Records { var $selectionActiveExceptions=array('tld'); var $record_generator=''; // only admin can add prefixes below var $deniedPrefixes=array('1','20','210','211','212','213','214','215','216','217','218','219','220','221','222','223','224','225','226','227','228','229','230','231','232','233','234','235','236','237','238','239','240','241','242','243','244','245','246','247','248','249','250','251','252','253','254','255','256','257','258','259','260','261','262','263','264','265','266','267','268','269','27','280','281','282','283','284','285','286','287','288','289','290','291','292','293','294','295','296','297','298','299','30','31','32','33','34','350','351','352','353','354','355','356','357','358','359','36','370','371','372','373','374','375','376','377','378','379','380','381','382','383','384','385','386','387','388','389','39','40','41','420','421','422','423','424','425','426','427','428','429','43','44','45','46','47','48','49','500','501','502','503','504','505','506','507','508','509','51','52','53','54','55','56','57','58','590','591','592','593','594','595','596','597','598','599','60','61','62','63','64','65','66','670','671','672','673','674','675','676','677','678','679','680','681','682','683','684','685','686','687','688','689','690','691','692','693','694','695','696','697','698','699','7','800','801','802','803','804','805','806','807','808','809','81','82','830','831','832','833','834','835','836','837','838','839','84','850','851','852','853','854','855','856','857','858','859','86','870','871','872','873','874','875','876','877','878','879','880','881','882','883','884','885','886','887','888','889','890','891','892','893','894','895','896','897','898','899','90','91','92','93','94','95','960','961','962','963','964','965','966','967','968','969','970','971','972','973','974','975','976','977','978','979','98','990','991','992','993','994','995','996','997','998','999'); var $FieldsAdminOnly=array( 'reseller' => array('type'=>'integer', 'help' => 'Range owner') ); var $Fields=array( 'customer' => array('type'=>'integer', 'help' => 'Range owner' ), 'serial' => array('type'=>'integer', 'help'=>'DNS serial number', 'readonly' => 1 ), 'ttl' => array('type'=>'integer', 'help'=>'Cache period in DNS clients' ), 'info' => array('type'=>'string', 'help' =>'Range description' ), 'size' => array('type'=>'integer', 'help'=>'Maximum number of telephone numbers' ), 'minDigits' => array('type'=>'integer', 'help'=>'Minimum number of digits for telephone numbers' ), 'maxDigits' => array('type'=>'integer', 'help'=>'Maximum number of digits for telephone numbers' ) ); function EnumRanges($SoapEngine) { dprint("init EnumRanges"); $this->filters = array('prefix' => trim(ltrim($_REQUEST['prefix_filter']),'+'), 'tld' => trim($_REQUEST['tld_filter']), 'info' => trim($_REQUEST['info_filter']) ); $this->Records($SoapEngine); $this->sortElements=array('changeDate' => 'Change date', 'prefix' => 'Prefix', 'tld' => 'TLD' ); /* $this->Fields['nameservers'] = array('type'=>'text', 'name'=>'Name servers', 'help'=>'Name servers authoritative for this DNS zone' ); */ if ($this->login_credentials['reseller_filters'][$this->reseller]['record_generator']) { //printf ("Engine: %s",$this->SoapEngine->soapEngine); if (is_array($this->login_credentials['reseller_filters'][$this->reseller]['record_generator'])) { $_rg=$this->login_credentials['reseller_filters'][$this->reseller]['record_generator']; if ($_rg[$this->SoapEngine->soapEngine]) { $this->record_generator=$_rg[$this->SoapEngine->soapEngine]; } } else { $this->record_generator=$this->login_credentials['reseller_filters'][$this->reseller]['record_generator']; } } else if (strlen($this->SoapEngine->record_generator)) { $this->record_generator=$this->SoapEngine->record_generator; } } function listRecords() { $this->getAllowedDomains(); $this->showSeachForm(); // Filter $filter=array('prefix' => $this->filters['prefix'], 'tld' => $this->filters['tld'], 'info' => $this->filters['info'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRanges'); $result = $this->SoapEngine->soapclient->getRanges($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->ranges[$i]) break; $range = $result->ranges[$i]; $index=$this->next+$i+1; $_url = $this->url.sprintf("&service=%s&action=Delete&prefix_filter=%s&tld_filter=%s", urlencode($this->SoapEngine->service), urlencode($range->id->prefix), urlencode($range->id->tld) ); if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$range->reseller); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['prefix_filter'] == $range->id->prefix && $_REQUEST['tld_filter'] == $range->id->tld) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } if ($this->adminonly) { $range_url=sprintf('%s',$this->url,$this->SoapEngine->service,$range->reseller,$range->id->prefix,$range->id->tld,$range->id->prefix); } else { $range_url=sprintf('%s',$this->url,$this->SoapEngine->service,$range->id->prefix,$range->id->tld,$range->id->prefix); } if ($this->record_generator) { $generator_url=sprintf('+Numbers',$this->url,$this->record_generator,$range->id->prefix,$range->id->tld,$range->maxDigits,$range->reseller); } else { $generator_url=''; } if ($range->size) { $usage=intval(100*$range->used/$range->size); $bar=$this->makebar($usage); } else { $bar=""; } $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($range->customer) ); $_nameservers=''; foreach ($range->nameservers as $_ns) { $_nameservers.= $_ns.' '; } printf(" ", $index, $_customer_url, $range->customer, $range->reseller, $range_url, $range->id->tld, $range->serial, $range->ttl, $range->info, $range->minDigits, $range->maxDigits, $range->size, $range->used, $bar, $range->changeDate, $_url, $actionText, $generator_url ); $i++; } } print "
Id Owner Prefix TLD Serial TTL Info Min Max Size Used Change date Actions
%s %s.%s +%s %s %s %s %s %s %s %s %s %s %s %s%s
"; if ($this->rows == 1) { $this->showRecord($range); } else { $this->showPagination($maxrows); } return true; } } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if (!strlen($this->filters['prefix']) || !strlen($this->filters['tld'])) { print "

Error: missing ENUM range id "; return false; } $rangeId=array('prefix'=>$this->filters['prefix'], 'tld'=>$this->filters['tld']); $function=array('commit' => array('name' => 'deleteRange', 'parameters' => array($rangeId), 'logs' => array('success' => sprintf('ENUM range +%s under %s has been deleted',$this->filters['prefix'],$this->filters['tld']) ) ) ); unset($this->filters); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showAddForm() { if ($this->selectionActive) return; printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; $this->showCustomerTextBox(); printf ("
Prefix +
",$_REQUEST['prefix']); printf ("
TLD"); if ($_REQUEST['tld']) { printf ("
",$_REQUEST['tld']); } else if ($this->filters['tld']) { printf ("
",$this->filters['tld']); } else if ($_tld=$this->getCustomerProperty('enum_ranges_last_tld')) { printf ("
",$_tld); } else { printf ("
"); } printf ("
TTL
"); printf ("
Min Digits
"); printf ("
Max Digits
"); printf ("
Info
",$_REQUEST['info']); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { $tld = trim($_REQUEST['tld']); $prefix = trim($_REQUEST['prefix']); $size = trim($_REQUEST['size']); $info = trim($_REQUEST['info']); if (!strlen($tld)) { $tld=$this->SoapEngine->default_enum_tld; } if (!strlen($tld) || !strlen($prefix) || !is_numeric($prefix)) { printf ("

Error: Missing TLD or prefix. "); return false; } if (!$this->adminonly) { if (in_array($prefix,$this->deniedPrefixes)) { print "

Error: Only an administrator account can create the prefix coresponding to a country code."; return false; } } list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!trim($_REQUEST['ttl'])) { $ttl = 3600; } else { $ttl = intval(trim($_REQUEST['ttl'])); } $range = array( 'id' => array( 'prefix' => $prefix, 'tld' => $tld ), 'ttl' => $ttl, 'info' => $info, 'minDigits' => intval(trim($_REQUEST['minDigits'])), 'maxDigits' => intval(trim($_REQUEST['maxDigits'])), 'size' => intval($size), 'customer' => intval($customer), 'reseller' => intval($reseller) ); $deleteRange = array( 'prefix'=>$prefix, 'tld'=>$tld ); $_p = array( array( 'name' => 'enum_ranges_last_tld', 'category' => 'web', 'value' => "$tld", 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); $function = array( 'commit' => array( 'name' => 'addRange', 'parameters' => array($range), 'logs' => array('success' => sprintf('ENUM range +%s under %s has been added',$prefix,$tld)) ) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showSeachFormCustom() { printf ("

Prefix
",$this->filters['prefix']); printf ("
TLD"); if (count($this->allowedDomains) > 0) { $selected_tld[$this->filters['tld']]='selected'; printf ("
"); } else { printf ("
",$this->filters['tld']); } printf ("
Info
",$this->filters['info']); } function getAllowedDomains() { // Filter $filter=array('prefix' => ''); // Range $range=array('start' => 0, 'count' => 500 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRanges'); $result = $this->SoapEngine->soapclient->getRanges($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach($result->ranges as $range) { $this->ranges[]=array('prefix' => $range->id->prefix, 'tld' => $range->id->tld, 'minDigits' => $range->minDigits, 'maxDigits' => $range->maxDigits ); if (in_array($range->id->tld,$this->allowedDomains)) continue; $this->allowedDomains[]=$range->id->tld; $seen[$range->id->tld]++; } if (!$seen[$this->SoapEngine->default_enum_tld]) { $this->allowedDomains[]=$this->SoapEngine->default_enum_tld; } } } function showRecord($range) { print ""; print " "; } $j=0; while ($j < $this->db->num_fields()) { $value=$this->db->Record[$metadata[$j]['name']]; $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; $class=$metadata[$j]['class']; if ($this->tables[$this->table]['fields'][$Fname]['size']) { $field_size=$this->tables[$this->table]['fields'][$Fname]['size']; } else { $field_size=$el_size; } $class=$this->tables[$this->table]['fields'][$Fname]['class']; if ($this->tables[$this->table]['fields'][$Fname]['readonly']=="1") { $extra_form_els = "disabled=true"; } else { $extra_form_els = ""; } $class=$this->tables[$this->table]['fields'][$Fname]['class']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { if (!$export) { if (!in_array($Fname, $this->tables[$this->table]['keys']) && !$this->readonly) { if ($this->table == 'prepaid' && $Fname == 'session_counter' && $value) { if (count($active_sessions) > 1) { $session_counter_txt = sprintf("%d sessions", $value); } else { $session_counter_txt = sprintf("%d session", $value); } printf( "", $found, $session_counter_txt ); } else { if (!$class) { $class="span1"; } print ""; } } else { if ($this->table == 'prepaid' && $Fname == 'session_counter' && $value) { if (count($active_sessions) > 1) { $session_counter_txt = sprintf("%d sessions", $value); } else { $session_counter_txt = sprintf("%d session", $value); } printf( "", $found, $session_counter_txt ); } else { print ""; } } } else { if ($j) { printf("%s%s", $delimiter, $value); } else { print "2"; } } } $j++; } $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { $SEARCH_NAME = "search_".$Fname; $value=$_REQUEST[$SEARCH_NAME]; if (!$export) { print ""; } } $j++; } if ($export) { print "\n"; } if (!$export) { if (!$this->tables[$this->table]['readonly']) { if ($subweb_task=="Delete" && $idForDeletion == $id && !$confirmDelete) { print ""; if ($extraInfo!='') { print " "; } } else { if ($this->table == 'prepaid') { print " "; } } } $i++; } if (!$export) { print "
"; printf ("",$_SERVER['PHP_SELF']); print ""; print ""; printf ("", $this->tel2enum($range->id->prefix,$range->id->tld)); if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { if ($item == 'nameservers') { foreach ($range->$item as $_item) { $nameservers.=$_item."\n"; } $item_value=$nameservers; } else { $item_value=$range->$item; } if ($this->FieldsAdminOnly[$item]['name']) { $item_name=$this->FieldsAdminOnly[$item]['name']; } else { $item_name=ucfirst($item); } if ($this->FieldsAdminOnly[$item]['type'] == 'text') { printf ("", $item_name, $item, $item_value, $this->FieldsAdminOnly[$item]['help'] ); } else { printf ("", $item_name, $item, $item_value, $this->FieldsAdminOnly[$item]['help'] ); } } } foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } if ($item == 'nameservers') { foreach ($range->$item as $_item) { $nameservers.=$_item."\n"; } $item_value=$nameservers; } else { $item_value=$range->$item; } if ($this->Fields[$item]['type'] == 'text') { printf ("", $item_name, $item, $item_value, $this->Fields[$item]['help'] ); }else if ($this->Fields[$item]['readonly']) { printf ("", $item_name, $item_value, $this->Fields[$item]['help'] ); } else { printf ("", $item_name, $item, $item_value, $this->Fields[$item]['help'] ); } } printf ("",$range->id->tld); printf ("",$range->id->prefix); $this->printFiltersToForm(); $this->printHiddenFormElements(); print ""; print "
DNS zone%s
%s %s
%s %s
%s %s
%s %s %s
%s %s
"; } function updateRecord () { //print "

Updating range ..."; if (!$_REQUEST['prefix_filter'] || !$_REQUEST['tld_filter']) return; $rangeid=array('prefix' => $_REQUEST['prefix_filter'], 'tld' => $_REQUEST['tld_filter'] ); if (!$range = $this->getRecord($rangeid)) { return false; } $range_old=$range; foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $range->$item = intval($_REQUEST[$var_name]); } else if ($item == 'nameservers') { $_txt=trim($_REQUEST[$var_name]); if (!strlen($_txt)) { unset($range->$item); } else { $_nameservers=array(); $_lines=explode("\n",$_txt); foreach ($_lines as $_line) { $_ns=trim($_line); $_nameservers[]=$_ns; } $range->$item=$_nameservers; } } else { $range->$item = trim($_REQUEST[$var_name]); } } if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { $var_name=$item.'_form'; if ($this->FieldsAdminOnly[$item]['type'] == 'integer') { $range->$item = intval($_REQUEST[$var_name]); } else { $range->$item = trim($_REQUEST[$var_name]); } } } $function=array('commit' => array('name' => 'updateRange', 'parameters' => array($range), 'logs' => array('success' => sprintf('ENUM range +%s under %s has been updated',$rangeid['prefix'],$rangeid['tld']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function getRecord($rangeid) { // Filter if (!$rangeid['prefix'] || !$rangeid['tld']) { print "Error in getRecord(): Missing prefix or tld"; return false; } $filter=array('prefix' => $rangeid['prefix'], 'tld' => $rangeid['tld'] ); // Range $range=array('start' => 0, 'count' => 1 ); // Order $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRanges'); $result = $this->SoapEngine->soapclient->getRanges($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->ranges[0]){ return $result->ranges[0]; } else { return false; } } } } class EnumMappings extends Records { var $default_ttl = 3600; var $default_priority = 5; var $sortElements=array('changeDate' => 'Change date', 'number' => 'Number', 'tld' => 'TLD' ); var $ranges=array(); var $FieldsReadOnly=array( 'customer', 'reseller' ); var $Fields=array( 'owner' => array('type'=>'integer'), 'info' => array('type'=>'string') ); var $mapping_fields=array('id' => 'integer', 'type' => 'string', 'mapto' => 'string', 'priority' => 'integer', 'ttl' => 'integer' ); var $NAPTR_services=array( "sip" => array("service"=>"sip", "webname"=>"SIP", "schemas"=>array("sip:","sips:")), "mailto" => array("service"=>"mailto", "webname"=>"Email", "schemas"=>array("mailto:")), "web:http" => array("service"=>"web:http", "webname"=>"WEB (http)", "schemas"=>array("http://")), "web:https" => array("service"=>"web:https", "webname"=>"WEB (https)", "schemas"=>array("https://")), "x-skype:callto" => array("service"=>"x-skype:callto", "webname"=>"Skype", "schemas"=>array("callto:")), "h323" => array("service"=>"h323", "webname"=>"H323", "schemas"=>array("h323:")), "iax" => array("service"=>"iax", "webname"=>"IAX", "schemas"=>array("iax:")), "iax2" => array("service"=>"iax2", "webname"=>"IAX2", "schemas"=>array("iax2:")), "mms" => array("service"=>"mms", "webname"=>"MMS", "schemas"=>array("tel:","mailto:")), "sms" => array("service"=>"sms", "webname"=>"SMS", "schemas"=>array("tel:","mailto:")), "ems" => array("service"=>"ems", "webname"=>"EMS", "schemas"=>array("tel:","mailto:")), "im" => array("service"=>"im", "webname"=>"IM", "schemas"=>array("im:")), "npd:tel" => array("service"=>"npd+tel", "webname"=>"Portability", "schemas"=>array("tel:")), "void:mailto" => array("service"=>"void:mailto", "webname"=>"VOID(mail)", "schemas"=>array("mailto:")), "void:http" => array("service"=>"void:http", "webname"=>"VOID(http)", "schemas"=>array("http://")), "void:https" => array("service"=>"void:https", "webname"=>"VOID(https)", "schemas"=>array("https://")), "voice" => array("service"=>"voice", "webname"=>"Voice", "schemas"=>array("voice:","tel:")), "tel" => array("service"=>"tel", "webname"=>"Tel", "schemas"=>array("tel:")), "fax:tel" => array("service"=>"fax:tel", "webname"=>"Fax", "schemas"=>array("tel:")), "ifax:mailto" => array("service"=>"ifax:mailto", "webname"=>"iFax", "schemas"=>array("mailto:")), "pres" => array("service"=>"pres", "webname"=>"Presence", "schemas"=>array("pres:")), "ft:ftp" => array("service"=>"ft:ftp", "webname"=>"FTP", "schemas"=>array("ftp://")), "loc:http" => array("service"=>"loc:http", "webname"=>"GeoLocation", "schemas"=>array("http://")), "key:http" => array("service"=>"key:http", "webname"=>"Public key", "schemas"=>array("http://")), "key:https" => array("service"=>"key:https", "webname"=>"Public key (HTTPS)", "schemas"=>array("https://")) ); function EnumMappings($SoapEngine) { dprint("init EnumMappings"); if ($_REQUEST['range_filter']) { list($_prefix,$_tld_filter)= explode("@",$_REQUEST['range_filter']); if ($_prefix && !$_REQUEST['number_filter']) { $_number_filter=$_prefix.'%'; } else { $_number_filter=$_REQUEST['number_filter']; } } else { $_number_filter=$_REQUEST['number_filter']; $_tld_filter=trim($_REQUEST['tld_filter']); } $_number_filter=ltrim($_number_filter,'+'); $this->filters = array('number' => ltrim($_number_filter,'+'), 'tld' => $_tld_filter, 'range' => trim($_REQUEST['range_filter']), 'type' => trim($_REQUEST['type_filter']), 'mapto' => trim($_REQUEST['mapto_filter']), 'owner' => trim($_REQUEST['owner_filter']) ); $this->Records($SoapEngine); $this->getAllowedDomains(); } function listRecords() { $this->showSeachForm(); $filter=array('number' => $this->filters['number'], 'tld' => $this->filters['tld'], 'type' => $this->filters['type'], 'mapto' => $this->filters['mapto'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumbers'); // Call function $result = $this->SoapEngine->soapclient->getNumbers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->numbers[$i]) break; $number = $result->numbers[$i]; $index=$this->next+$i+1; $j=1; foreach ($number->mappings as $_mapping) { unset($sip_engine); foreach (array_keys($this->login_credentials['reseller_filters']) as $_res) { if ($_res == $number->reseller) { if ($this->login_credentials['reseller_filters'][$_res]['sip_engine']) { $sip_engine=$this->login_credentials['reseller_filters'][$_res]['sip_engine']; break; } } } if (!$sip_engine) { if ($this->login_credentials['reseller_filters']['default']['sip_engine']) { $sip_engine=$this->login_credentials['reseller_filters']['default']['sip_engine']; } else { $sip_engine=$this->SoapEngine->sip_engine; } } if (preg_match("/^sip:(.*)$/",$_mapping->mapto,$m) && $this->sip_settings_page) { $url=sprintf('%s?account=%s&reseller=%s&sip_engine=%s', $this->sip_settings_page,urlencode($m[1]), $number->reseller,$sip_engine); if ($this->adminonly) $url .= sprintf('&adminonly=%s',$this->adminonly); foreach (array_keys($this->SoapEngine->extraFormElements) as $element) { if (!strlen($this->SoapEngine->extraFormElements[$element])) continue; $url .= sprintf('&%s=%s',$element,urlencode($this->SoapEngine->extraFormElements[$element])); } $mapto=sprintf(" sip:%s",$url,$m[1]); } else { $mapto=sprintf("%s",$_mapping->mapto); } $_url = $this->url.sprintf("&service=%s&action=Delete&number_filter=%s&tld_filter=%s&mapto_filter=%s", urlencode($this->SoapEngine->service), urlencode($number->id->number), urlencode($number->id->tld), urlencode($_mapping->mapto) ); if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$number->reseller); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['number_filter'] == $number->id->number && $_REQUEST['tld_filter'] == $number->id->tld && $_REQUEST['mapto_filter'] == $_mapping->mapto) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } if ($j==1) { $_number_url = $this->url.sprintf("&service=%s&number_filter=%s&tld_filter=%s", urlencode($this->SoapEngine->service), urlencode($number->id->number), urlencode($number->id->tld) ); if ($this->adminonly) $_number_url.= sprintf ("&reseller_filter=%s",$number->reseller); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($number->customer) ); if ($number->owner) { $_owner_url = sprintf ("%s", $this->url, urlencode($this->SoapEngine->soapEngine), urlencode($number->owner), $number->owner ); } else { $_owner_url=''; } printf(" ", $index, $_customer_url, $number->customer, $number->reseller, $_number_url, $number->id->number, $number->id->tld, $number->info, $_owner_url, ucfirst($_mapping->type), $_mapping->id, $mapto, $_mapping->ttl, $number->changeDate, $_url, $actionText ); } else { printf(" ", ucfirst($_mapping->type), $_mapping->id, $mapto, $_mapping->ttl, $number->changeDate, $_url, $actionText ); } $j++; } if (!is_array($number->mappings) || !count($number->mappings)) { $_url = $this->url.sprintf("&service=%s&action=Delete&number_filter=%s&tld_filter=%s", urlencode($this->SoapEngine->service), urlencode($number->id->number), urlencode($number->id->tld), urlencode($_mapping->mapto) ); if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$number->reseller); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['number_filter'] == $number->id->number && $_REQUEST['tld_filter'] == $number->id->tld && $_REQUEST['mapto_filter'] == $_mapping->mapto) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_number_url = $this->url.sprintf("&service=%s&number_filter=%s&tld_filter=%s", urlencode($this->SoapEngine->service), urlencode($number->id->number), urlencode($number->id->tld) ); if ($this->adminonly) $_number_url.= sprintf ("&reseller_filter=%s",$number->reseller); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($number->customer) ); if ($number->owner) { $_owner_url = sprintf ("%s", $this->url, urlencode($this->SoapEngine->soapEngine), urlencode($number->owner), $number->owner ); } else { $_owner_url=''; } printf(" ", $index, $_customer_url, $number->customer, $number->reseller, $_number_url, $number->id->number, $number->id->tld, $number->info, $_owner_url, $number->changeDate, $_url, $actionText ); } printf(" "); $i++; } } print "
Range Owner Phone number TLD Info Owner Type Id Map to TTL Change date Actions
%s %s.%s +%s %s %s %s %s %s %s %s %s %s
%s %s %s %s %s %s
%s %s.%s +%s %s %s %s %s %s
"; if ($this->rows == 1 ) { $this->showRecord($number); } else { $this->showPagination($maxrows); } return true; } } function getLastNumber() { // Filter $filter=array('number' => '' ); // Range $range=array('start' => 0, 'count' => 1 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumbers'); // Call function $result = $this->SoapEngine->soapclient->getNumbers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->total) { $number = array('number' => $result->numbers[0]->id->number, 'tld' => $result->numbers[0]->id->tld, 'mappings' => $result->numbers[0]->mappings ); return $number; } } return false; } function showSeachFormCustom() { /* print " "; */ printf ("

Number
",$_REQUEST['number_filter']); printf ("
Map to"); print " "; printf ("
",$this->filters['mapto']); printf ("
Owner
",$this->filters['owner']); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['number']) { $number=$dictionary['number']; } else { $number=$this->filters['number']; } if ($dictionary['tld']) { $tld=$dictionary['tld']; } else { $tld=$this->filters['tld']; } if ($dictionary['mapto']) { $mapto=$dictionary['mapto']; } else { $mapto=$this->filters['mapto']; } if (!strlen($number) || !strlen($tld)) { print "

Error: missing ENUM number or TLD "; return false; } $enum_id=array('number' => $number, 'tld' => $tld ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $result = $this->SoapEngine->soapclient->getNumber($enum_id); if (!(new PEAR)->isError($result)) { // the number exists and we make an update $result_new=$result; if (count($result->mappings) > 1) { foreach ($result->mappings as $_mapping) { if ($_mapping->mapto != $mapto) { $mappings_new[]=array('type' => $_mapping->type, 'mapto' => $_mapping->mapto, 'ttl' => $_mapping->ttl, 'priority' => $_mapping->priority, 'id' => $_mapping->id ); } } if (!is_array($mappings_new)) $mappings_new = array(); $result_new->mappings=$mappings_new; $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($result_new), 'logs' => array('success' => sprintf('ENUM mapping %s has been deleted',$mapto))) ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } else { $function=array('commit' => array('name' => 'deleteNumber', 'parameters' => array($enum_id), 'logs' => array('success' => sprintf('ENUM number +%s under %s has been deleted',$number,$tld))), ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } unset($this->filters); } else { return false; } } function showAddForm() { if ($this->selectionActive) return; //if ($this->adminonly && !$this->filters['reseller']) return; if (!count($this->ranges)) { //print "

You must create at least one ENUM range before adding ENUM numbers"; return false; } printf ("

",$_SERVER['PHP_SELF']); print "
"; if ($this->adminonly) { printf (" ",$this->filters['reseller']); } print "
"; printf (" Number"); print ""; if ($_REQUEST['number']) { printf ("",$_REQUEST['number']); } else if ($_number=$this->getCustomerProperty('enum_numbers_last_number')) { $_prefix=$_range['prefix']; preg_match("/^$_prefix(.*)/",$_number,$m); printf ("",$m[1]); } else { printf (""); } print "
"; printf ("Map to"); print " "; if ($_REQUEST['type']) { $selected_naptr_service[$_REQUEST['type']]='selected'; } else if ($_type=$this->getCustomerProperty('enum_numbers_last_type')) { $selected_naptr_service[$_type]='selected'; } printf (" ",$_REQUEST['mapto']); print "
"; print "TTL"; print ""; if ($_REQUEST['ttl']) { printf ("
",$_REQUEST['ttl']); } else if ($_ttl=$this->getCustomerProperty('enum_numbers_last_ttl')) { printf ("
",$_ttl); } else { printf (""); } printf ("
Owner
",$_REQUEST['owner']); printf ("
Info
",$_REQUEST['info']); $this->printHiddenFormElements(); print "
"; } function getAllowedDomains() { // Filter $filter=array('prefix' => '', 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 200 ); // Order $orderBy = array('attribute' => 'prefix', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRanges'); $result = $this->SoapEngine->soapclient->getRanges($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach($result->ranges as $range) { $this->ranges[]=array('prefix' => $range->id->prefix, 'tld' => $range->id->tld, 'minDigits' => $range->minDigits, 'maxDigits' => $range->maxDigits ); if (in_array($range->id->tld,$this->allowedDomains)) continue; $this->allowedDomains[]=$range->id->tld; $seen[$range->id->tld]++; } if (!$seen[$this->SoapEngine->default_enum_tld]) { $this->allowedDomains[]=$this->SoapEngine->default_enum_tld; } } } function addRecord($dictionary=array()) { $prefix=''; if ($dictionary['range']) { list($prefix,$tld)=explode('@',trim($dictionary['range'])); $this->skipSaveProperties=true; } else if ($dictionary['tld']) { $tld = $dictionary['tld']; } else if ($_REQUEST['range']) { list($prefix,$tld)=explode('@',trim($_REQUEST['range'])); } else { $tld = trim($_REQUEST['tld']); } if ($dictionary['number']) { $number = $dictionary['number']; } else { $number = trim($_REQUEST['number']); } $number=$prefix.$number; if (!strlen($tld)) { $tld=$this->SoapEngine->default_enum_tld; } if (!strlen($tld) || !strlen($number) || !is_numeric($number)) { printf ("

Error: Missing TLD or number. "); return false; } if ($dictionary['ttl']) { $ttl = intval($dictionary['ttl']); } else { $ttl = intval(trim($_REQUEST['ttl'])); } if (!$ttl) $ttl=3600; if ($dictionary['priority']) { $priority = intval($dictionary['priority']); } else { $priority = intval(trim($_REQUEST['priority'])); } if ($dictionary['owner']) { $owner = intval($dictionary['owner']); } else { $owner = intval(trim($_REQUEST['owner'])); } if ($dictionary['info']) { $info = $dictionary['info']; } else { $info = trim($_REQUEST['info']); } if (!$priority) $priority=5; $enum_id=array('number' => $number, 'tld' => $tld); if ($dictionary['mapto']) { $mapto = $dictionary['mapto']; } else { $mapto = trim($_REQUEST['mapto']); } if ($dictionary['type']) { $type = $dictionary['type']; } else { $type = trim($_REQUEST['type']); } if (preg_match("/^([a-z0-9]+:\/\/)(.*)$/i",$mapto,$m)) { $_scheme = $m[1]; $_value = $m[2]; } else if (preg_match("/^([a-z0-9]+:)(.*)$/i",$mapto,$m)) { $_scheme = $m[1]; $_value = $m[2]; } else { $_scheme = ''; $_value = $mapto; } if (!$_value) { $lastNumber=$this->getLastNumber(); foreach($lastNumber['mappings'] as $_mapping) { if ($_mapping->type == trim($type)) { if (preg_match("/^(.*)@(.*)$/",$_mapping->mapto,$m)) { $_value = $number.'@'.$m[2]; break; } } } } if (!$_scheme || !in_array($_scheme,$this->NAPTR_services[trim($type)]['schemas'])) { $_scheme=$this->NAPTR_services[trim($type)]['schemas'][0]; } $mapto=$_scheme.$_value; $enum_number=array('id' => $enum_id, 'owner' => $owner, 'info' => $info, 'mappings' => array(array('type' => $type, 'mapto' => $mapto, 'ttl' => $ttl, 'priority' => $priority ) ) ); if (!$this->skipSaveProperties=true) { $_p=array( array('name' => 'enum_numbers_last_range', 'category' => 'web', 'value' => $_REQUEST['range'], 'permission' => 'customer' ), array('name' => 'enum_numbers_last_type', 'category' => 'web', 'value' => "$type", 'permission' => 'customer' ), array('name' => 'enum_numbers_last_number', 'category' => 'web', 'value' => "$number", 'permission' => 'customer' ), array('name' => 'enum_numbers_last_ttl', 'category' => 'web', 'value' => "$ttl", 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $result = $this->SoapEngine->soapclient->getNumber($enum_id); if ((new PEAR)->isError($result)) { $error_msg=$result->getMessage(); $error_fault=$result->getFault(); $error_code=$result->getCode(); if ($error_fault->detail->exception->errorcode == "3002") { $function=array('commit' => array('name' => 'addNumber', 'parameters' => array($enum_number), 'logs' => array('success' => sprintf('ENUM number +%s under %s has been added',$number,$tld))) ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } } else { // the number exists and we make an update $result_new=$result; foreach ($result->mappings as $_mapping) { $mappings_new[]=array('type' => $_mapping->type, 'mapto' => $_mapping->mapto, 'ttl' => $_mapping->ttl, 'priority' => $_mapping->priority, 'id' => $_mapping->id ); if ($_mapping->mapto == $mapto) { printf ("

Info: ENUM mapping %s for number %s already exists",$mapto,$number); return $result; } } $mappings_new[]=array('type' => trim($type), 'mapto' => $mapto, 'ttl' => intval(trim($_REQUEST['ttl'])), 'priority'=> intval(trim($_REQUEST['priority'])), ); // add mapping $result_new->mappings=$mappings_new; $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($result_new), 'logs' => array('success' => sprintf('ENUM number +%s under %s has been updated',$number,$tld))) ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } } function getRecordKeys() { // Filter $filter=array('number' => $this->filters['number'], 'tld' => $this->filters['tld'], 'type' => $this->filters['type'], 'mapto' => $this->filters['mapto'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 1000 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumberss'); // Call function $result = $this->SoapEngine->soapclient->getNumbers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->numbers as $number) { $this->selectionKeys[]=array('number' => $number->id->number, 'tld' => $number->id->tld); } return true; } } function showRecord($number) { print ""; print ""; print ""; print ""; print ""; print ""; print ""; print " "; print ""; print "
"; print "

Number

"; print "
"; print "

Mappings

"; print "
"; print ""; printf ("",$_SERVER['PHP_SELF']); print ""; printf ("", $this->tel2enum($number->id->number,$number->id->tld)); foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } if ($this->Fields[$item]['type'] == 'text') { printf ("", $item_name, $item, $number->$item ); } else { printf ("", $item_name, $item, $number->$item ); } } printf ("",$number->id->tld); printf ("",$number->id->number); $this->printFiltersToForm(); $this->printHiddenFormElements(); print "
DNS name%s
%s
%s
"; print "
"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; foreach ($number->mappings as $_mapping) { $j++; unset($selected_type); print ""; print ""; printf ("",$_mapping->id,$_mapping->id); $selected_type[$_mapping->type]='selected'; printf (" "; printf (" ", $_mapping->mapto, $_mapping->ttl ); print ""; } $j++; print ""; print ""; print ""; printf (" "; printf (" " ); print ""; print "
IdTypeMap toTTL
$j%d
"; print "
"; } function getRecord($enumid) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $result = $this->SoapEngine->soapclient->getNumber($enumid); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return $result; } } function updateRecord () { //print "

Updating number ..."; if (!$_REQUEST['number_filter'] || !$_REQUEST['tld_filter']) return; $enumid=array('number' => $_REQUEST['number_filter'], 'tld' => $_REQUEST['tld_filter'] ); if (!$number = $this->getRecord($enumid)) { return false; } $number_old=$number; $new_mappings=array(); /* foreach ($number->mappings as $_mapping) { foreach (array_keys($this->mapping_fields) as $field) { if ($this->mapping_fields[$field] == 'integer') { $new_mapping[$field]=intval($_mapping->$field); } else { $new_mapping[$field]=$_mapping->$field; } } $new_mappings[]=$new_mapping; } */ $j=0; while ($j< count($_REQUEST['mapping_type'])) { $mapto = $_REQUEST['mapping_mapto'][$j]; $type = $_REQUEST['mapping_type'][$j]; $id = $_REQUEST['mapping_id'][$j]; $ttl = intval($_REQUEST['mapping_ttl'][$j]); $priority = intval($_REQUEST['mapping_priority'][$j]); if (!$ttl) $ttl = $this->default_ttl; if (!$priority) $priority = $this->default_priority; if (strlen($mapto)) { if (preg_match("/^([a-z0-9]+:\/\/)(.*)$/i",$mapto,$m)) { $_scheme = $m[1]; $_value = $m[2]; } else if (preg_match("/^([a-z0-9]+:)(.*)$/i",$mapto,$m)) { $_scheme = $m[1]; $_value = $m[2]; } else { $_scheme = ''; $_value = $mapto; } reset($this->NAPTR_services); if (!$_scheme || !in_array($_scheme,$this->NAPTR_services[trim($type)]['schemas'])) { $_scheme=$this->NAPTR_services[trim($type)]['schemas'][0]; } $mapto=$_scheme.$_value; $new_mappings[]=array( 'type' => $type, 'ttl' => $ttl, 'id' => intval($id), 'mapto' => $mapto, 'priority' => $priority ); } $j++; } $number->mappings=$new_mappings; if (!is_array($number->mappings)) $number->mappings=array(); foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $number->$item = intval($_REQUEST[$var_name]); } else { $number->$item = trim($_REQUEST[$var_name]); } } //print_r($number); $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($number), 'logs' => array('success' => sprintf('ENUM number +%s under %s has been updated',$enumid['number'],$enumid['tld']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result) ; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showTextBeforeCustomerSelection() { print _("Range owner"); } } class DnsZones extends Records { var $FieldsAdminOnly=array( 'reseller' => array('type'=>'integer', 'help' => 'Zone owner') ); var $Fields=array( 'customer' => array('type'=>'integer', 'help' => 'Zone owner' ), 'serial' => array('type'=>'integer', 'help'=>'Serial number', 'readonly' => 1 ), 'email' => array('type'=>'string', 'help'=>'Administrator address' ), 'ttl' => array('type'=>'integer', 'help'=>'Time to live of SOA record' ), 'minimum' => array('type'=>'integer', 'help'=>'Default time to live period' ), 'retry' => array('type'=>'integer', 'help'=>'Retry transfer period' ), 'expire' => array('type'=>'integer', 'help'=>'Expire period' ), 'info' => array('type'=>'string', 'help' =>'Zone description' ) ); function DnsZones($SoapEngine) { dprint("init DnsZones"); $this->filters = array( 'name' => trim($_REQUEST['name_filter']), 'info' => trim($_REQUEST['info_filter']) ); $this->Records($SoapEngine); $this->sortElements=array('changeDate' => 'Change date', 'name' => 'Name' ); $this->Fields['nameservers'] = array('type'=>'text', 'name'=>'Name servers', 'help'=>'Authoritative name servers' ); } function showAfterEngineSelection () { if ($this->SoapEngine->name_servers) { //printf (" Available name servers: %s",$this->SoapEngine->name_servers); } } function listRecords() { $this->showSeachForm(); // Filter $filter=array('name' => $this->filters['name'], 'info' => $this->filters['info'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); $result = $this->SoapEngine->soapclient->getZones($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found

"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->zones[$i]) break; $zone = $result->zones[$i]; $index=$this->next+$i+1; $_url = $this->url.sprintf("&service=%s&action=Delete&name_filter=%s", urlencode($this->SoapEngine->service), urlencode($zone->name) ); if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$zone->reseller); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['name_filter'] == $zone->name) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $zone_url=sprintf('%s&service=%s&name_filter=%s', $this->url, $this->SoapEngine->service, $zone->name ); $records_url = $this->url.sprintf("&service=dns_records@%s&zone_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($zone->name) ); if ($this->adminonly) $zone_url .= sprintf("&reseller_filter=%s",$zone->reseller); if ($this->adminonly) $records_url .= sprintf("&reseller_filter=%s",$zone->reseller); $customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($zone->customer) ); sort($zone->nameservers); $ns_text=''; foreach ($zone->nameservers as $ns) { $ns_text.= $ns." "; } printf(" ", $index, $customer_url, $zone->customer, $zone->reseller, $zone_url, $zone->name, $zone->email, $zone->info, $records_url, $zone->serial, $zone->ttl, $zone->changeDate, $_url, $actionText ); printf(" "); $i++; } } print "
Id Owner Zone Administrator Info Serial Default TTL Change date Actions
%s %s.%s %s %s %s Records %s %s %s %s
"; if ($this->rows == 1) { $this->showRecord($zone); } else { $this->showPagination($maxrows); } return true; } } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if (!strlen($this->filters['name'])) { print "

Error: missing Dns zone name "; return false; } $name=$this->filters['name']; $function=array('commit' => array('name' => 'deleteZone', 'parameters' => array($name), 'logs' => array('success' => sprintf('Dns zone %s has been deleted',$this->filters['name']) ) ) ); unset($this->filters); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showAddForm() { if ($this->selectionActive) return; printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; $this->showCustomerTextBox(); printf ("
DNS zone
",$_REQUEST['name']); $this->printHiddenFormElements(); printf (" Import DNS zones from file:
Select file Change Remove
" ); print "
"; } function addRecord($dictionary=array()) { $name = trim($_REQUEST['name']); $info = trim($_REQUEST['info']); $name_servers = trim($_REQUEST['name_servers']); if ($_FILES['import_file']['tmp_name']) { $content=fread(fopen($_FILES['import_file']['tmp_name'], "r"), $_FILES['import_file']['size']); //print_r($content); if (!$imported_data=json_decode($content, true)) { printf ("

Error: reading imported data. "); return false; } //print_r($imported_data); if (!in_array('dns_zones', array_keys($imported_data))) { printf ("

Error: Missing zones in imported data. "); return false; } if (!in_array('dns_records', array_keys($imported_data))) { return false; printf ("

Error: Missing records in imported data. "); } foreach($imported_data['customers'] as $customer) { // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth); $customer['credit'] = floatval($customer['credit']); $customer['balance'] = floatval($customer['balance']); // Call function $this->log_action('addAccount'); $result = $this->SoapEngine->soapclientCustomers->addAccount($customer); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 5001) { $result = $this->SoapEngine->soapclientCustomers->updateCustomer($customer); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } else { printf('

Customer %s has been updated',$customer['id']); } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } } else { printf('

Customer %s has been added',$customer['id']); } } $name_servers = array(); foreach($imported_data['dns_zones'] as $zone) { flush(); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addZone'); $result = $this->SoapEngine->soapclient->addZone($zone); $name_servers[$zone['name']] = $zone['nameservers']; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 7001) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('updateZone'); $result = $this->SoapEngine->soapclient->updateZone($zone); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } else { printf('

Zone %s has been updated',$zone['name']); } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } } else { printf('

Zone %s has been added',$zone['name']); } } $added = 0; $updated = 0; foreach($imported_data['dns_records'] as $record) { flush(); if (in_array($record['name'], $name_servers[$record['zone']]) && $record['type'] == "A") { continue; } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addRecord'); $result = $this->SoapEngine->soapclient->addRecord($record); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 7003) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('updateRecord'); $result = $this->SoapEngine->soapclient->updateRecord($record); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } else { $added += 1; } } else { $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); printf ("

Error: $log"); } } else { $added += 1; } } printf('

%d DNS records added and %d updated',$added, $updated); return true; } else { if (isset($this->SoapEngine->allow_none_local_dns_zones)) { $allow_none_local_dns_zones = $this->SoapEngine->allow_none_local_dns_zones; } else { $allow_none_local_dns_zones = false; } if (!strlen($name)) { printf ("

Error: Missing zone name.

"); return false; } $lookup1 = dns_get_record($name); //dprint_r($lookup1); $ns_array1=explode(" ",trim($this->SoapEngine->name_servers)); if (empty($lookup1) || $allow_none_local_dns_zones){ $valid = 1; } else { $valid = 0; foreach($lookup1 as $lrecord){ if ($lrecord['type'] == 'NS') { if(in_array($lrecord['target'],$ns_array1)){ $valid = 1 ; } } } } if ($valid==0){ printf ("

Error: DNS zone already exists on other server. Please contact our support if you plan to transfer this DNS zone to this system.

"); return false; } if (is_numeric($prefix)) { printf ("

Error: Numeric zone names are not allowed. Use ENUM port instead. "); return false; } list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!trim($_REQUEST['ttl'])) { $ttl=3600; } else { $ttl=intval(trim($_REQUEST['ttl'])); } if ($name_servers) { $ns_array=explode(" ",trim($name_servers)); } else if ($this->login_credentials['login_type'] != 'admin' && $this->SoapEngine->name_servers){ $ns_array=explode(" ",trim($this->SoapEngine->name_servers)); } else { $ns_array=array(); } $zone=array( 'name' => $name, 'ttl' => $ttl, 'info' => $info, 'customer' => intval($customer), 'reseller' => intval($reseller), 'nameservers' => $ns_array ); $function=array('commit' => array('name' => 'addZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('DNS zone %s has been added',$name))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } } function showSeachFormCustom() { printf ("

DNS zone
",$this->filters['name']); printf ("
Info
",$this->filters['info']); } function showRecord($zone) { print ""; print " ",$this->filters['reseller']); printf ("",$this->filters['reseller']); } else if ($this->reseller) { printf ("",$this->reseller); } foreach (array_keys($this->addFields) as $item) { if ($this->addFields[$item]['name']) { $item_name=$this->addFields[$item]['name']; } else { $item_name=ucfirst($item); } $item_form=$item.'_form'; if ($item=='timezone') { $_value=$_REQUEST['timezone_form']; if (!$_value) { if ($this->SoapEngine->default_timezone) { $_value=$this->SoapEngine->default_timezone; } else { $_value='Europe/Amsterdam'; } } printf ("
"; $this->showTimezones($_value); print "
"; } else if ($item=='state') { printf ("
", $item_name ); print "
"; } else if ($item=='country') { printf ("
", $item_name ); print "
"; } else { if ($this->addFields[$item]['type'] == 'textarea') { printf ("
", $item_name, $item, $_REQUEST[$item_form] ); } elseif ($this->addFields[$item]['type'] == 'boolean') { $_var='select_'.$item; ${$_var}[$_REQUEST[$item_form]]='selected'; printf (" ", $item_name, $item, ${$_var}[0], ${$_var}[1] ); } else { $type='text'; if (strstr($item,'password')) $type='password'; printf ("
", $item_name, $item, $type, $_REQUEST[$item_form] ); if ($item=='password' && $confirmPassword) { printf ("
", $_REQUEST[confirm_password_form] ); } } } } if ($_REQUEST['notify']) $checked_notify='checked'; printf ("
",$checked_notify); $this->printHiddenFormElements(); print ""; print " "; } function addRecord($dictionary=array(),$confirmPassword=false) { if (!$this->checkRecord($dictionary)) { return false; } foreach (array_keys($this->addFields) as $item) { if ($dictionary[$item]) { $customer[$item] = strip_tags(trim($dictionary[$item])); } else { $item_form = $item.'_form'; $customer[$item] = strip_tags(trim($_REQUEST[$item_form])); } } if (!strlen($customer['username'])) $customer['username'] = trim($customer['firstName']).'.'.trim($customer['lastName'].$this->RandomNumber(5)); if (!strlen($customer['state'])) $customer['state'] = 'N/A'; if (!strlen($customer['country'])) $customer['country'] = 'N/A'; if (!strlen($customer['city'])) $customer['city'] = 'Unknown'; if (!strlen($customer['address'])) $customer['address'] = 'Unknown'; if (!strlen($customer['postcode'])) $customer['postcode'] = 'Unknown'; if (!strlen($customer['timezone'])) $customer['timezone'] = 'Europe/Amsterdam'; if ($dictionary['reseller']) { $customer['reseller']=intval($dictionary['reseller']); } else if ($this->adminonly && $this->filters['reseller']) { $customer['reseller']=intval($this->filters['reseller']); } $customer['username'] = strtolower(preg_replace ("/\s+/",".",trim($customer['username']))); $customer['username'] = preg_replace ("/\.{2,}/",".",$customer['username']); if ($customer['state'] != 'N/A') { $_state=$customer['state'].' '; } else { $_state=''; } if (!strlen($customer['tel'])){ $customer['tel'] = '+19999999999'; } else { $customer['tel'] = preg_replace("/[^0-9\+]/","",$customer['tel']); if (preg_match("/^00(\d{1,20})$/",$customer['tel'],$m)) { $customer['tel'] = "+".$m[1]; } } $customer['billingEmail'] = $customer['email']; if ($customer['address'] != 'Unknown') { $customer['billingAddress'] = $customer['address']."\n". $customer['postcode']." ".$customer['city']."\n". $_state.$customer['country']."\n"; } if ($confirmPassword) { if (!strlen($customer['password'])) { $this->errorMessage='Password cannot be empty'; return false; } else if ($customer['password'] != $_REQUEST['confirm_password_form']) { $this->errorMessage='Password is not confirmed'; return false; } } if (!strlen($customer['password'])) $customer['password'] = $this->RandomString(6); if (is_array($dictionary['properties'])) { $customer['properties']=$dictionary['properties']; } else { $customer['properties']=array(); } if ($this->hide_html) { $logs = array(); } else { $logs = array('success' => sprintf('Customer entry %s %s has been created',$customer['firstName'],$customer['lastName'])); } $function=array('commit' => array('name' => 'addAccount', 'parameters' => array($customer), 'logs' => $logs ) ); if ($result = $this->SoapEngine->execute($function,$this->html)) { // We have succesfully added customer entry $this->showAddForm=false; if ($dictionary['notify'] || $_REQUEST['notify']) $this->notify($customer); return $result; } else { return false; } } function notify($customer) { /* must be supplied with an array: $customer=array('firstName' => '' 'lastName' => '', 'email' => '', 'username' => '', 'password' => '' ); */ if ($this->support_web) { $url=$this->support_web; } else { if ($_SERVER['HTTPS']=="on") { $protocolURL="https://"; } else { $protocolURL="http://"; } $url=sprintf("%s%s",$protocolURL,$_SERVER['HTTP_HOST']); } $body= sprintf("Dear %s,\n\n",$customer['firstName']). sprintf("This e-mail message is for your record. You have registered a login account at %s as follows:\n\n",$url). sprintf("Username: %s\n",$customer['username']). sprintf("Password: %s\n",$customer['password']). "\n". sprintf("The registration has been performed from the IP address %s.",$_SERVER['REMOTE_ADDR']). "\n". "\n". sprintf("This message was sent in clear text over the Internet and it is advisable, in order to protect your account, to login and change your password displayed in this message. "). "\n". "\n". "This is an automatic message, do not reply.\n"; $from = sprintf("From: %s",$this->support_email); $subject = sprintf("Your account at %s",$url); return mail($customer['email'], $subject, $body, $from); } function getRecordKeys() { // Filter $filter=array('username' => $this->filters['username'], 'firstName' => $this->filters['firstName'], 'lastName' => $this->filters['lastName'], 'organization' => $this->filters['organization'], 'tel' => $this->filters['tel'], 'email' => $this->filters['email'], 'web' => $this->filters['web'], 'city' => $this->filters['city'], 'country' => $this->filters['country'], 'only_resellers' => $this->filters['only_resellers'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 1000 ); // Order $orderBy = array('attribute' => 'customer', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Call function if ($this->adminonly && $this->filters['only_resellers']) { $this->log_action('getResellers'); $result = $this->SoapEngine->soapclient->getResellers($Query); } else { $this->log_action('getCustomers'); $result = $this->SoapEngine->soapclient->getCustomers($Query); } if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->accounts as $customer) { $this->selectionKeys[]=$customer->id; } } } function getProperty($customer,$name) { foreach ($customer->properties as $_property) { if ($_property->name == $name) { return $_property->value; } } return false; } function getCustomerId($username) { if (!strlen($username)) return false; $filter = array('username' => $username); $range = array('start' => 0,'count' => 1); $orderBy = array('attribute' => 'customer', 'direction' => 'ASC'); $Query=array('filter' => $filter,'orderBy' => $orderBy,'range' => $range); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Call function $this->log_action('getCustomers'); $result = $this->SoapEngine->soapclient->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if (count($result->accounts) == 1) { return $result->accounts[0]->id; } else { return false; } } } function getCustomer($username) { if (!strlen($username)) { return false; } $filter = array('username' => $username); $range = array('start' => 0,'count' => 1); $orderBy = array('attribute' => 'customer', 'direction' => 'ASC'); $Query=array('filter' => $filter,'orderBy' => $orderBy,'range' => $range); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Call function $this->log_action('getCustomers'); $result = $this->SoapEngine->soapclient->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if (count($result->accounts) == 1) { return $result->accounts[0]; } else { return false; } } } function setInitialCredits($credits=array()) { $properties=array(); foreach (array_keys($credits) as $item) { if ($this->allProperties[$item]['category'] != 'credit') continue; $properties[] = array('name' => $item, 'value' => "$credits[$item]", 'category' => $this->allProperties[$item]['category'], 'permission' => $this->allProperties[$item]['permission'] ); } return $properties; } function showVcard($vcardDictionary) { #http://www.stab.nu/vcard/ # This file will return an vCard Version 3.0 Compliant file to the user. Observe that you should set up # # your web-server with the correct MIME-type. The reason to use the \r\n as breakes is because it should be # # more compatible with MS Outlook. All other, better coded, clients sholdnt have any problems with this. # # # # Version 1.0 (2003-08-29) # # # # Author: Alf Lovbo # # # # This document is released under the GNU General Public License. # # # ############################################################################################################# # # # USAGE # # ----- # # The following variables can be used togheter with this document for accessing the functions supplied. All # # of the functions listed below takes an value described by the comment after the |-symbol. # # # # $vcard_birtda | Birthday YYYY-MM-DD $vcard_f_name | Family name # # $vcard_cellul | Cellular Phone Number $vcard_compan | Company Name # # $vcard_h_addr | Street Address (home) $vcard_h_city | City (home) # # $vcard_h_coun | Country (home) $vcard_h_fax | Fax (home) # # $vcard_h_mail | E-mail (home) $vcard_h_phon | Phone (home) # # $vcard_h_zip | Zip-code (home) $vcard_nickna | Nickname # # $vcard_note | Note $vcard_s_name | Given name # # $vcard_uri | Homepage, URL $vcard_w_addr | Street Address (work) # # $vcard_w_city | City (work) $vcard_w_coun | Country (work) # # $vcard_w_fax | Fax (work) $vcard_w_mail | E-mail (work) # # $vcard_w_phon | Phone (work) $vcard_w_role | Function (work) # # $vcard_w_titl | Title (work) $vcard_w_zip | Zip-code (work) # # # ############################################################################################################# # You dont need to change anything below this comment. # ############################################################################################################# /* $vcardDictionary=array( "vcard_nickna" => $this->username, "vcard_f_name" => $this->lastname, "vcard_s_name" => $this->firstname, "vcard_compan" => $this->organization, "vcard_w_addr" => $this->address, "vcard_w_zip" => $this->postcode, "vcard_w_city" => $this->city, "vcard_w_state" => $this->county, "vcard_w_coun" => $this->country, "vcard_w_mail" => $this->email, "vcard_w_phon" => $this->tel, "vcard_w_fax" => $this->fax, "vcard_enum" => $this->enum, "vcard_sip" => $this->sip, "vcard_uri" => $this->web, "vcard_cellul" => $this->mobile ); */ foreach (array_keys($vcardDictionary) as $field) { $value=$vcardDictionary[$field]; ${$field}=$value; } if ($vcard_w_state=="N/A") $vcard_w_state=" "; $vcard_w_addr = preg_replace("/[\n|\r]/"," ",$vcard_w_addr); $vcard_sortst = $vcard_f_name; $vcard_tz = date("O"); $vcard_rev = date("Y-m-d"); $vcard = "BEGIN:VCARD\r\n"; $vcard .= "VERSION:3.0\r\n"; $vcard .= "CLASS:PUBLIC\r\n"; $vcard .= "PRODID:-//PHP vCard Class//NONSGML Version 1//SE\r\n"; $vcard .= "REV:" . $vcard_rev . "\r\n"; $vcard .= "TZ:" . $vcard_tz . "\r\n"; if ($vcard_f_name != ""){ if ($vcard_s_name != ""){ $vcard .= "FN:" . $vcard_s_name . " " . $vcard_f_name . "\r\n"; $vcard .= "N:" . $vcard_f_name . ";" . $vcard_s_name . "\r\n"; } else { $vcard .= "FN:" . $vcard_f_name . "\r\n"; $vcard .= "N:" . $vcard_f_name . "\r\n"; } } elseif ($vcard_s_name != ""){ $vcard .= "FN:" . $vcard_s_name . "\r\n"; $vcard .= "N:" . $vcard_s_name . "\r\n"; } if ($vcard_nickna != ""){ $vcard .= "NICKNAME:" . $vcard_nickna . "\r\n"; } if ($vcard_compan != ""){ $vcard .= "ORG:" . $vcard_compan . "\r\n"; $vcard .= "SORTSTRING:" . $vcard_compan . "\r\n"; } elseif ($vcard_f_name != ""){ $vcard .= "SORTSTRING:" . $vcard_f_name . "\r\n"; } if ($vcard_birtda != ""){ $vcard .= "BDAY:" . $vcard_birtda . "\r\n"; } if ($vcard_w_role != ""){ $vcard .= "ROLE:" . $vcard_w_role . "\r\n"; } if ($vcard_w_titl != ""){ $vcard .= "TITLE:" . $vcard_w_titl . "\r\n"; } if ($vcard_note != ""){ $vcard .= "NOTE:" . $vcard_note . "\r\n"; } if ($vcard_w_mail != ""){ $item++; $vcard .= "item$item.EMAIL;TYPE=INTERNET;type=PREF:" . $vcard_w_mail . "\r\n"; $vcard .= "item$item.X-ABLabel:email" . "\r\n"; } if ($vcard_cellul != ""){ $vcard .= "TEL;TYPE=VOICE,CELL:" . $vcard_cellul . "\r\n"; } if ($vcard_enum != ""){ $item++; $vcard .= "item$item.TEL:" . $vcard_enum . "\r\n"; $vcard .= "item$item.X-ABLabel:ENUM" . "\r\n"; } if ($vcard_sip != ""){ $item++; $vcard .= "item$item.TEL;TYPE=INTERNET:" . $vcard_sip . "\r\n"; $vcard .= "item$item.X-ABLabel:SIP" . "\r\n"; } if ($vcard_w_fax != ""){ $vcard .= "TEL;TYPE=FAX,WORK:" . $vcard_w_fax . "\r\n"; } if ($vcard_w_phon != ""){ $vcard .= "TEL;TYPE=VOICE,WORK:" . $vcard_w_phon . "\r\n"; } if ($vcard_uri != ""){ $vcard .= "URL:" . $vcard_uri . "\r\n"; } if ($vcard_addr != ""){ $vcard .= "ADR;TYPE=HOME,POSTAL,PARCEL:" . $vcard_addr . "\r\n"; } if ($vcard_labl != ""){ $vcard .= "LABEL;TYPE=DOM,HOME,POSTAL,PARCEL:" . $vcard_labl . "\r\n"; } $vcard_addr = ""; $vcard_labl = ""; if ($vcard_w_addr != ""){ $vcard_addr = ";;" . $vcard_w_addr; $vcard_labl = $vcard_w_addr; } if ($vcard_w_city != ""){ if ($vcard_addr != ""){ $vcard_addr .= ";" . $vcard_w_city; } else{ $vcard_addr .= ";;;" . $vcard_w_city; } if ($vcard_labl != ""){ $vcard_labl .= "\\r\\n" . $vcard_w_city; } else { $vcard_labl = $vcard_w_city; } } if ($vcard_w_state != ""){ if ($vcard_addr != ""){ $vcard_addr .= ";" . $vcard_w_state; } else{ $vcard_addr .= ";;;" . $vcard_w_state; } if ($vcard_labl != ""){ $vcard_labl .= "\\r\\n" . $vcard_w_state; } else { $vcard_labl = $vcard_w_state; } } if ($vcard_w_zip != ""){ if ($vcard_addr != ""){ $vcard_addr .= ";" . $vcard_w_zip; } else{ $vcard_addr .= ";;;;" . $vcard_w_zip; } if ($vcard_labl != ""){ $vcard_labl .= "\\r\\n" . $vcard_w_zip; } else { $vcard_labl = $vcard_w_zip; } } if ($vcard_w_coun != ""){ if ($vcard_addr != ""){ $vcard_addr .= ";" . $vcard_w_coun; } else{ $vcard_addr .= ";;;;;" . $vcard_w_coun; } if ($vcard_labl != ""){ $vcard_labl .= "\\r\\n" . $vcard_w_coun; } else { $vcard_labl = $vcard_w_coun; } } if ($vcard_addr != ""){ $vcard .= "ADR;TYPE=WORK,POSTAL,PARCEL:" . $vcard_addr . "\r\n"; } if ($vcard_labl != ""){ $vcard .= "LABEL;TYPE=DOM,WORK,POSTAL,PARCEL:" . $vcard_labl . "\r\n"; } if ($vcard_categ != ""){ $vcard .= "CATEGORY:" . $vcard_categ . "\r\n"; } $vcard .= "END:VCARD\n"; return $vcard; } } class Presence { function Presence($SoapEngine) { $this->SoapEngine = $SoapEngine; } function publishPresence ($soapEngine,$SIPaccount=array(),$note='None',$activity='idle') { if (!in_array($soapEngine,array_keys($this->SoapEngine->soapEngines))) { print "Error: soapEngine '$soapEngine' does not exist.\n"; return false; } if (!$SIPaccount['username'] || !$SIPaccount['domain'] || !$SIPaccount['password'] ) { print "Error: SIP account not defined\n"; return false; } $this->SOAPurl = $this->SoapEngine->soapEngines[$soapEngine]['url']; $this->PresencePort = new WebService_SoapSIMPLEProxy_PresencePort($this->SOAPurl); $this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); $allowed_activities=array('open', 'idle', 'busy', 'available' ); if (in_array($activity,$allowed_activities)) { $presentity['activity'] = $activity; } else { $presentity['activity'] = 'open'; } $presentity['note'] = $note; $result = $this->PresencePort->setPresenceInformation(array("username" =>$SIPaccount['username'],"domain" =>$SIPaccount['domain']),$SIPaccount['password'], $presentity); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } return true; } function getPresenceInformation ($soapEngine,$SIPaccount) { if (!in_array($soapEngine,array_keys($this->SoapEngine->soapEngines))) { print "Error: soapEngine '$soapEngine' does not exist.\n"; return false; } if (!$SIPaccount['username'] || !$SIPaccount['domain'] || !$SIPaccount['password'] ) { print "Error: SIP account not defined"; return false; } $this->SOAPurl = $this->SoapEngine->soapEngines[$soapEngine]['url']; $this->PresencePort = new WebService_SoapSIMPLEProxy_PresencePort($this->SOAPurl); $this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); $result = $this->PresencePort->getPresenceInformation(array("username" =>$SIPaccount['username'],"domain" =>$SIPaccount['domain']),$SIPaccount['password']); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { return $result; } } } class recordGenerator extends SoapEngine { //this class generates in bulk enum numbers and sip accounts var $template = array(); var $allowedPorts = array(); var $maxRecords = 500; var $minimum_number_length = 4; var $maximum_number_length = 15; var $default_ip_access_list = ''; var $default_call_limit = ''; function recordGenerator($generatorId,$record_generators,$soapEngines,$login_credentials=array()) { $this->record_generators = $record_generators; $this->generatorId = $generatorId; $this->login_credentials = $login_credentials; //dprint_r($this->login_credentials); $keys = array_keys($this->record_generators); if (!$generatorId) $generatorId=$keys[0]; if (!in_array($generatorId,array_keys($this->record_generators))) { return false; } if (strlen($this->login_credentials['soap_filter'])) { $this->soapEngines = $this->getSoapEngineAllowed($soapEngines,$this->login_credentials['soap_filter']); } else { $this->soapEngines = $soapEngines; } if (in_array($this->record_generators[$generatorId]['sip_engine'],array_keys($this->soapEngines))) { // sip zones if (count($this->allowedPorts[$this->record_generators[$generatorId]['sip_engine']]) > 1 && !in_array('sip_accounts',$this->allowedPorts[$this->record_generators[$generatorId]['sip_engine']])) { // sip port not available dprint("sip port not avaliable"); } else { $sip_engine = 'sip_accounts@'.$this->record_generators[$generatorId]['sip_engine']; $this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $this->sipRecords->getAllowedDomains(); print_r($this->record_generators[$generatorId]['sip_engine']); if ($this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['ip_access_list']){ $this->default_ip_access_list = $this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['ip_access_list']; } if ($this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['call_limit']){ $this->default_call_limit = $this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['call_limit']; } } } else { printf ("Error: sip_engine %s does not exist",$this->record_generators[$generatorId]['sip_engine']); } if (in_array($this->record_generators[$generatorId]['enum_engine'],array_keys($this->soapEngines))) { if (count($this->allowedPorts[$this->record_generators[$generatorId]['enum_engine']]) > 1 && !in_array('enum_numbers',$this->allowedPorts[$this->record_generators[$generatorId]['enum_engine']])) { dprint("enum port not avaliable"); // enum port not available } else { // enum mappings $enum_engine = 'enum_numbers@'.$this->record_generators[$generatorId]['enum_engine']; $this->EnumSoapEngine = new SoapEngine($enum_engine,$soapEngines,$login_credentials); $_enum_class = $this->EnumSoapEngine->records_class; $this->enumRecords = new $_enum_class($this->EnumSoapEngine); } } else { printf ("Error: enum_engine %s does not exist",$this->record_generators[$generatorId]['enum_engine']); } if (in_array($this->record_generators[$generatorId]['customer_engine'],array_keys($this->soapEngines))) { if (count($this->allowedPorts[$this->record_generators[$generatorId]['customer_engine']]) > 1 && !in_array('customers',$this->allowedPorts[$this->record_generators[$generatorId]['customer_engine']])) { dprint("customer port not avaliable"); } else { $customer_engine = 'customers@'.$this->record_generators[$generatorId]['customer_engine']; $this->CustomerSoapEngine = new SoapEngine($customer_engine,$soapEngines,$login_credentials); $_customer_class = $this->CustomerSoapEngine->records_class; $this->customerRecords = new $_customer_class($this->CustomerSoapEngine); } } else { printf ("Error: customer_engine %s does not exist",$this->record_generators[$generatorId]['customer_engine']); } if ($_REQUEST['reseller_filter']) $this->template['reseller']=intval($_REQUEST['reseller_filter']); if ($_REQUEST['customer_filter']) $this->template['customer']=intval($_REQUEST['customer_filter']); } function showGeneratorForm() { print "

"; printf ("",$_SERVER['PHP_SELF']); print ""; print ""; printf ("",$zone->name); if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { if ($item == 'nameservers') { foreach ($zone->$item as $_item) { $nameservers.=$_item."\n"; } $item_value=$nameservers; } else { $item_value=$zone->$item; } if ($this->FieldsAdminOnly[$item]['name']) { $item_name=$this->FieldsAdminOnly[$item]['name']; } else { $item_name=ucfirst($item); } if ($this->FieldsAdminOnly[$item]['type'] == 'text') { printf ("", $item_name, $item, $item_value, $this->FieldsAdminOnly[$item]['help'] ); } else { printf ("", $item_name, $item, $item_value, $this->FieldsAdminOnly[$item]['help'] ); } } } foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } if ($item == 'nameservers') { foreach ($zone->$item as $_item) { $nameservers.=$_item."\n"; } $item_value=$nameservers; } else { $item_value=$zone->$item; } if ($this->Fields[$item]['type'] == 'text') { printf ("", $item_name, $item, $item_value, $this->Fields[$item]['help'] ); } else if ($this->Fields[$item]['readonly']) { printf ("", $item_name, $item_value, $this->Fields[$item]['help'] ); } else { printf ("", $item_name, $item, $item_value, $this->Fields[$item]['help'] ); } } printf ("",$zone->id->tld); printf ("",$zone->id->prefix); $this->printFiltersToForm(); $this->printHiddenFormElements(); print ""; print "
DNS zone%s
%s %s
%s %s
%s %s
%s %s %s
%s %s
"; } function updateRecord () { if (!$_REQUEST['name_filter']) return; //dprintf ("

Updating zone %s...",$_REQUEST['name_filter']); $filter=array('name' => $_REQUEST['name_filter']); if (!$zone = $this->getRecord($filter)) { return false; } $zone_old=$zone; foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $zone->$item = intval($_REQUEST[$var_name]); } else if ($item == 'nameservers') { $_txt=trim($_REQUEST[$var_name]); if (!strlen($_txt)) { unset($zone->$item); } else { $_nameservers=array(); $_lines=explode("\n",$_txt); foreach ($_lines as $_line) { $_ns=trim($_line); $_nameservers[]=$_ns; } $zone->$item=$_nameservers; } } else { $zone->$item = trim($_REQUEST[$var_name]); } } if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { $var_name=$item.'_form'; if ($this->FieldsAdminOnly[$item]['type'] == 'integer') { $zone->$item = intval($_REQUEST[$var_name]); } else { $zone->$item = trim($_REQUEST[$var_name]); } } } $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('DNS zone %s has been updated',$filter['name']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function getRecord($zone) { // Filter if (!$zone['name']) { print "Error in getRecord(): Missing zone name"; return false; } $filter=array('name' => $zone['name']); // Range $range=array('start' => 0, 'count' => 1 ); // Order $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); $result = $this->SoapEngine->soapclient->getZones($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->zones[0]){ return $result->zones[0]; } else { return false; } } } function getRecordKeys() { // Filter $filter=array('name' => $this->filters['name'], 'info' => $this->filters['info'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => 0, 'count' => 200 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); // Call function $result = $this->SoapEngine->soapclient->getZones($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->zones as $zone) { $this->selectionKeys[]=array('name' => $zone->name); } return true; } } function hide_html() { if ($_REQUEST['action'] == 'PerformActions' && $_REQUEST['sub_action'] == 'export') { return true; } else { return false; } } } class DnsRecords extends Records { var $max_zones_selection = 50; var $typeFilter = false; var $default_ttl = 3600; var $fancy = false; var $sortElements = array( 'changeDate' => 'Change date', 'type' => 'Type', 'name' => 'Name' ); var $FieldsReadOnly = array( 'customer', 'reseller' ); var $Fields = array( 'type' => array('type'=>'string'), 'priority' => array('type'=>'integer'), 'value' => array('type'=>'string'), 'ttl' => array('type'=>'integer') ); var $recordTypes = array( 'A' => 'IP address', 'AAAA' => 'IP v6 address', 'CNAME' => 'Hostname alias', 'MX' => 'Mail server address', 'SRV' => 'Server resource', 'NS' => 'Name server address', 'NAPTR' => 'Name authority', 'PTR' => 'Reverse IP address', 'TXT' => 'Text', 'LOC' => 'Geo location' ); var $havePriority = array('MX','SRV','NAPTR'); var $addRecordFunction = 'addRecord'; var $deleteRecordFunction = 'deleteRecord'; var $updateRecordFunction = 'updateRecord'; var $getRecordsFunction = 'getRecords'; var $getRecordFunction = 'getRecord'; var $recordTypesTemplate = array( 'sip2sip' => array( 'name' => 'SIP2SIP infrastructure', 'records' => array( 'naptr1' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '600', 'value' => '20 100 "s" "SIP+D2T" "" _sip._tcp' ), 'naptr2' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '600', 'value' => '30 100 "s" "SIP+D2U" "" _sip._udp' ), 'naptr3' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '600', 'value' => '10 100 "s" "SIPS+D2T" "" _sips._tcp' ), 'srv1' => array( 'name' => '_sip._tcp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '600', 'value' => '100 5060 proxy.sipthor.net' ), 'srv2' => array( 'name' => '_sip._udp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '600', 'value' => '100 5060 proxy.sipthor.net' ), 'srv3' => array( 'name' => '_sips._tcp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '600', 'value' => '100 5061 proxy.sipthor.net' ), 'srv4' => array( 'name' => '_stun._udp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 3478 stun1.sipthor.net' ), 'srv5' => array( 'name' => '_stun._udp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 3478 stun2.sipthor.net' ), 'srv6' => array( 'name' => '_msrps._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 2855 msrprelay.sipthor.net' ), 'txt1' => array( 'name' => 'xcap', 'type' => 'TXT', 'priority' => '10', 'value' => 'https://xcap.sipthor.net/xcap-root' ) ), ), 'siptcp' => array( 'name' => 'SIP - TCP transport', 'records' => array( 'naptr' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '3600', 'value' => '10 100 "s" "SIP+D2T" "" _sip._tcp' ), 'srv' => array( 'name' => '_sip._tcp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '3600', 'value' => '100 5060 #VALUE#|10 5060 sip' ) ), ), 'siptls' => array( 'name' => 'SIP - TLS transport', 'records' => array( 'naptr' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '3600', 'value' => '20 100 "s" "SIPS+D2T" "" _sips._tcp' ), 'srv' => array( 'name' => '_sips._tcp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '3600', 'value' => '100 5061 #VALUE#|10 5061 sip' ) ) ), 'sipudp' => array( 'name' => 'SIP - UDP transport', 'records' => array( 'naptr' => array( 'name' => '', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '3600', 'value' => '30 100 "s" "SIP+D2U" "" _sip._udp' ), 'srv' => array( 'name' => '_sip._udp', 'type' => 'SRV', 'priority' => '100', 'ttl' => '3600', 'value' => '100 5060 #VALUE#|10 5060 sip' ) ), ), 'stun' => array( 'name' => 'STUN - NAT mirror', 'records' => array( 'srv' => array( 'name' => '_stun._udp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 3478 #VALUE#|10 3478 stun' ) ), ), 'xmpp-server' => array( 'name' => 'XMPP server-to-server over TCP', 'records' => array( 'srv' => array( 'name' => '_xmpp-server._tcp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 5269 #VALUE#|10 5269 xmpp' ), 'srv1' => array( 'name' => '_jabber._tcp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 5269 #VALUE#|10 5269 xmpp' ) ), ), 'xmpp-client' => array( 'name' => 'XMPP client-to-server over TCP', 'records' => array( 'srv' => array( 'name' => '_xmpp-client._tcp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 5222 #VALUE#|10 5222 xmpp' ) ), ), 'xmpps-server' => array( 'name' => 'XMPP server-to-server over TLS', 'records' => array( 'srv' => array( 'name' => '_xmpps-server._tcp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 5269 #VALUE#|10 5269 xmpp' ), 'srv1' => array( 'name' => '_jabbers._tcp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 5269 #VALUE#|10 5269 xmpp' ) ), ), 'xmpps-client' => array( 'name' => 'XMPP client-to-server over TLS', 'records' => array( 'srv' => array( 'name' => '_xmpps-client._tcp', 'type' => 'SRV', 'priority' => '0', 'value' => '10 5222 #VALUE#|10 5222 xmpp' ) ), ), 'msrp' => array( 'name' => 'MSRP - IM relay', 'records' => array( 'srv' => array( 'name' => '_msrps._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 2855 msrprelay' ) ) ), 'sipthor' => array( 'name' => 'SIP - Thor network', 'records' => array( 'eventserver' => array( 'name' => '_eventserver._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 8000 eventserver' ), 'sipserver' => array( 'name' => '_sip._udp', 'type' => 'SRV', 'priority' => '10', 'value' => '30 5060 proxy' ), 'sipns1' => array( 'name' => 'proxy', 'type' => 'NS', 'value' => 'ns1' ), 'sipns2' => array( 'name' => 'proxy', 'type' => 'NS', 'value' => 'ns2' ), 'sipns3' => array( 'name' => 'proxy', 'type' => 'NS', 'value' => 'ns3' ), 'ngnproserver' => array( 'name' => '_ngnpro._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 9200 ngnpro' ), 'ngnns1' => array( 'name' => 'ngnpro', 'type' => 'NS', 'value' => 'ns1' ), 'ngnns2' => array( 'name' => 'ngnpro', 'type' => 'NS', 'value' => 'ns2' ), 'ngnns3' => array( 'name' => 'ngnpro', 'type' => 'NS', 'value' => 'ns3' ), 'xcapserver' => array( 'name' => '_xcap._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 443 xcap' ), 'xcapns1' => array( 'name' => 'xcap', 'type' => 'NS', 'value' => 'ns1' ), 'xcapns2' => array( 'name' => 'xcap', 'type' => 'NS', 'value' => 'ns2' ), 'xcapns3' => array( 'name' => 'xcap', 'type' => 'NS', 'value' => 'ns3' ), 'msrpserver' => array( 'name' => '_msrps._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 2855 msrprelay' ), 'msrpns1' => array( 'name' => 'msrprelay', 'type' => 'NS', 'value' => 'ns1' ), 'msrpns2' => array( 'name' => 'msrprelay', 'type' => 'NS', 'value' => 'ns2' ), 'msrpns3' => array( 'name' => 'msrprelay', 'type' => 'NS', 'value' => 'ns3' ), 'voicemail' => array( 'name' => '_voicemail._tcp', 'type' => 'SRV', 'priority' => '10', 'value' => '0 9200 voicemail' ), 'vmns1' => array( 'name' => 'voicemail', 'type' => 'NS', 'value' => 'ns1' ), 'vmns2' => array( 'name' => 'voicemail', 'type' => 'NS', 'value' => 'ns2' ), 'vmns3' => array( 'name' => 'voicemail', 'type' => 'NS', 'value' => 'ns3' ) ) ) ); function DnsRecords($SoapEngine) { dprint("init DnsRecords"); $_name = trim($_REQUEST['name_filter']); if (strlen($_name) && !strstr($_name,'.') && !strstr($_name,'%')) { $_name .= '%'; } if ($this->typeFilter) { $this->filters = array( 'id' => trim($_REQUEST['id_filter']), 'zone' => trim($_REQUEST['zone_filter']), 'name' => $_name, 'type' => $this->typeFilter, 'value' => trim($_REQUEST['value_filter']), 'owner' => trim($_REQUEST['owner_filter']) ); } else { $this->filters = array( 'id' => trim($_REQUEST['id_filter']), 'zone' => trim($_REQUEST['zone_filter']), 'name' => $_name, 'type' => trim($_REQUEST['type_filter']), 'value' => trim($_REQUEST['value_filter']), 'owner' => trim($_REQUEST['owner_filter']) ); } $this->Records($SoapEngine); $this->getAllowedDomains(); } function listRecords() { $this->showSeachForm(); if ($this->typeFilter) { $filter = array( 'id' => intval($this->filters['id']), 'zone' => $this->filters['zone'], 'name' => $this->filters['name'], 'type' => $this->typeFilter, 'value' => $this->filters['value'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); } else { $filter = array( 'id' => intval($this->filters['id']), 'zone' => $this->filters['zone'], 'name' => $this->filters['name'], 'type' => $this->filters['type'], 'value' => $this->filters['value'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); } // Range $range = array( 'start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array( 'attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action($this->getRecordsFunction); // Call function $result = call_user_func_array(array($this->SoapEngine->soapclient,$this->getRecordsFunction),array($Query)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows > 1 && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found. Click on record id to edit the values.

"; if ($this->fancy) { print " "; } else { print " "; } if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->records[$i]) { break; } $record = $result->records[$i]; $index=$this->next+$i+1; $_url = $this->url.sprintf( "&service=%s&action=Delete&name_filter=%s&zone_filter=%s&id_filter=%s", urlencode($this->SoapEngine->service), urlencode($record->name), urlencode($record->zone), urlencode($record->id) ); if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$record->reseller); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['id_filter'] == $record->id) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_customer_url = $this->url.sprintf( "&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($record->customer) ); $_zone_url = $this->url.sprintf( "&service=dns_zones@%s&name_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($record->zone) ); if ($this->adminonly) { $_zone_url.= sprintf("&reseller_filter=%s", $record->reseller); } $_record_url = $this->url.sprintf( "&service=%s@%s&zone_filter=%s&id_filter=%s", urlencode($this->SoapEngine->service), urlencode($this->SoapEngine->soapEngine), urlencode($record->zone), urlencode($record->id) ); if ($this->adminonly) $_record_url.= sprintf ("&reseller_filter=%s",$record->reseller); if ($record->owner) { $_owner_url = sprintf( "%s", $this->url, urlencode($this->SoapEngine->soapEngine), urlencode($record->owner), $record->owner ); } else { $_owner_url=''; } if ($this->fancy) { printf( " ", $index, $_customer_url, $record->customer, $record->reseller, $_zone_url, $record->zone, $_record_url, $record->id, $record->name, $record->type, $record->value, $record->owner, $record->changeDate, $_url, $actionText ); } else { printf(" ", $index, $_customer_url, $record->customer, $record->reseller, $_zone_url, $record->zone, $_record_url, $record->id, $record->name, $record->type, $record->priority, $record->value, $record->ttl, $record->changeDate, $_url, $actionText ); } $i++; } } print "
Zone owner Zone Id Name Type Value Owner Change date Actions
Zone owner Zone Id Name Type Priority Value TTL Change date Actions
%s %s.%s %s %s %s %s %s %s %s %s
%s %s.%s %s %s %s %s %s %s %s %s %s
"; if ($this->rows == 1 ) { $this->showRecord($record); } else { $this->showPagination($maxrows); } return true; } } function showSeachFormCustom() { printf( "

Record Id
", $this->filters['id'] ); printf( "
Name
", $this->filters['name'] ); if (count($this->allowedDomains) > 0) { $selected_zone[$this->filters['zone']]='selected'; print ""; } else { printf( "
DNS zone
", $this->filters['zone'] ); } if ($this->typeFilter) { printf( " Type %s", $this->typeFilter, $this->typeFilter ); } else { $selected_type[$this->filters['type']]='selected'; echo " "; } printf( "
Value
", $this->filters['value'] ); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['id']) { $id=$dictionary['id']; } else { $id=$this->filters['id']; } if (!$id) { print "

Missing record id. "; return false; } $function = array( 'commit' => array( 'name' => $this->deleteRecordFunction, 'parameters' => array($id), 'logs' => array('success' => sprintf('DNS record %s has been deleted',$id)) ) ); $zone=$this->filters['zone']; unset($this->filters); $this->filters['zone']=$zone; $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showAddForm() { /* if ($this->adminonly) { if (!$this->filters['reseller']) { print "

To add a new record you must search first for a customer"; return; } } */ printf("

", $_SERVER['PHP_SELF']); print "
"; if ($this->adminonly) { printf( "", $this->filters['reseller'] ); } print "
Name "; printf( "
", trim($_REQUEST['name']) ); if (count($this->allowedDomains) > 0) { if ($_REQUEST['zone']) { $selected_zone[$_REQUEST['zone']]='selected'; } else if ($this->filters['zone']) { $selected_zone[$this->filters['zone']]='selected'; } else if ($_zone=$this->getCustomerProperty('dns_records_last_zone')) { $selected_zone[$_zone]='selected'; } print "."; } else { if ($_REQUEST['zone']) { $_zone_selected=$_REQUEST['zone']; } else if ($this->filters['zone']) { $_zone_selected=$this->filters['zone']; } else if ($_zone=$this->getCustomerProperty('dns_records_last_zone')) { $_zone_selected=$_zone; } printf( "
DNS zone
", $_zone_selected ); } if ($this->typeFilter) { printf("Type %s ",$this->typeFilter,$this->typeFilter); } else { print "
Type
"; } printf( "
Value
", trim($_REQUEST['value']) ); if (!$this->fancy) { printf( "
Priority
", trim($_REQUEST['priority']) ); } $this->printHiddenFormElements(); print "
"; } function getAllowedDomains() { // Filter $filter = array( 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range = array( 'start' => 0, 'count' => $this->max_zones_selection ); // Order $orderBy = array( 'attribute' => 'name', 'direction' => 'ASC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); $result = $this->SoapEngine->soapclient->getZones($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { if ($result->total > $this->max_zones_selection) return false; foreach($result->zones as $zone) { if (in_array($zone->name,$this->allowedDomains)) continue; $this->allowedDomains[]=$zone->name; $seen[$zone->name]++; } } } function addRecord($dictionary=array()) { if ($this->typeFilter) { $type = $this->typeFilter; } else if ($dictionary['type']) { $type = $dictionary['type']; } else { $type = trim($_REQUEST['type']); } if ($dictionary['name']) { $name = $dictionary['name']; } else { $name = trim($_REQUEST['name']); } $name = rtrim($name,"."); if (preg_match("/^(.+)@(.*)$/", $name, $m)) { $zone = $m[2]; } else { if ($dictionary['zone']) { $zone=$dictionary['zone']; $this->skipSaveProperties=true; } else if ($_REQUEST['zone']) { $zone=$_REQUEST['zone']; } if ($type == 'MBOXFW') { $name .= '@'.$zone; } } if (!strlen($zone)) { if ($this->html) { echo "
Error: Missing zone name.
"; } return false; } $this->filters['zone']=$zone; if (!strlen($type)) { if ($this->html) { echo "
Error: Missing record type.
"; } return false; } if ($dictionary['value']) { $value = $dictionary['value']; } else { $value = trim($_REQUEST['value']); } $value=rtrim($value,"."); if ($this->adminonly) { if ($dictionary['reseller']) { } else if ($this->filters['reseller']) { } else { if ($this->html) { echo "
Error: Missing reseller, please first search zones for a given reseller
"; } return false; } } if ($dictionary['ttl']) { $ttl = intval($dictionary['ttl']); } else { $ttl = intval(trim($_REQUEST['ttl'])); } if (!$ttl) $ttl=3600; if ($dictionary['owner']) { $owner = intval($dictionary['owner']); } else { $owner = intval(trim($_REQUEST['owner'])); } if ($dictionary['priority']) { $priority = $dictionary['priority']; } else { $priority = trim($_REQUEST['priority']); } if (in_array($type,array_keys($this->recordTypes))) { // See RFC 1912 - Section 2.4 if (trim($name).trim($zone) == trim($zone) && $type == 'CNAME') { printf( "
Error: CNAME (%s) equal to zone name (%s) is not allowed
", trim($name).trim($zone), trim($zone) ); return false; } if (!strlen($value)) { if ($this->html) { echo "
Error: Missing record value.
"; } return false; } $record = array( 'name' => trim($name), 'zone' => trim($zone), 'type' => $type, 'value' => trim($value), 'owner' => intval($owner), 'ttl' => intval($ttl), 'priority' => intval($priority) ); if (!$this->skipSaveProperties=true) { $_p = array( array( 'name' => 'dns_records_last_zone', 'category' => 'web', 'value' => $_REQUEST['zone'], 'permission' => 'customer' ), array( 'name' => 'dns_records_last_type', 'category' => 'web', 'value' => "$type", 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); } $function = array( 'commit' => array( 'name' => $this->addRecordFunction, 'parameters' => array($record), 'logs' => array('success' => sprintf('DNS record %s under %s has been added',$name,$zone)) ) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($this->html) { $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); } syslog(LOG_NOTICE, $log); return false; } else { return true; } } else if (in_array($type,array_keys($this->recordTypesTemplate))) { $push_notifications_server = $this->getResellerProperty('push_notifications_server_private') or $this->getResellerProperty('push_notifications_server'); if ($type == "sip2sip" && $push_notifications_server) { if (preg_match("/^(.*):(\d+);transport=(.*)$/", $push_notifications_server, $m)) { $push_hostname = $m[1]; $push_port = $m[2]; $push_transport = $m[3]; if ($push_transport == "tls") { $naptr_type = "_sips._tcp"; $naptr_s = "SIPS+D2T"; } else if ($push_transport == "tcp") { $naptr_type = "_sip._tcp"; $naptr_s = "SIP+D2T"; } else { $naptr_type = "_sip._udp"; $naptr_s = "SIP+D2U"; } $this->recordTypesTemplate[$type]['records']['push_naptr'] = array( 'name' => 'push', 'type' => 'NAPTR', 'priority' => '100', 'ttl' => '600', 'value' => sprintf('10 100 "s" "%s" "" %s.push', $naptr_s, $naptr_type) ); $this->recordTypesTemplate[$type]['records']['push_srv'] = array( 'name' => sprintf('%s.push', $naptr_type), 'type' => 'SRV', 'priority' => '100', 'ttl' => '600', 'value' => sprintf('100 %d %s', $push_port, $push_hostname) ); } } foreach (array_values($this->recordTypesTemplate[$type]['records']) as $_records) { $value_new=''; if (strlen($_records['value'])) { if (preg_match("/^_sip/",$_records['name'])) { if (!$value) { $value=$this->getCustomerProperty('dns_records_last_sip_server'); if (!$value) { $value = $this->getCustomerProperty('sip_proxy'); } if (!value) { $value = $this->SoapEngine->default_sip_proxy; } $save_new_value=false; } else { $save_new_value=true; } } $els=explode("|",$_records['value']); foreach ($els as $el) { if (preg_match("/#VALUE#/",$el)) { if ($value) { $value_new=preg_replace("/#VALUE#/",$value,$el); } else { continue; } } else { $value_new=$el; } break; } // save value if type sip server if ($save_new_value && $_records['name'] && preg_match("/^_sip/",$_records['name'])) { $_p = array( array( 'name' => 'dns_records_last_sip_server', 'category' => 'web', 'value' => $value, 'permission' => 'customer' ) ); $this->setCustomerProperties($_p); } } if (!in_array($_records['type'],array_keys($this->recordTypes))) { continue; } $record = array( 'name' => $_records['name'], 'zone' => trim($zone), 'type' => $_records['type'], 'value' => $value_new, 'owner' => intval($owner), 'ttl' => intval($_records['ttl']), 'priority' => intval($_records['priority']) ); //print_r($record); $function=array( 'commit' => array( 'name' => $this->addRecordFunction, 'parameters' => array($record), 'logs' => array( 'success' => sprintf('Dns %s record under %s has been added', $_records['type'], $zone) ) ) ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($this->html) { $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); } syslog(LOG_NOTICE, $log); return false; } } } else { if ($this->html) { printf ("
Error: Invalid or missing record type.
"); } return false; } return true; } function getRecordKeys() { // Filter $filter = array( 'id' => intval($this->filters['id']), 'zone' => $this->filters['zone'], 'name' => $this->filters['name'], 'type' => $this->filters['type'], 'value' => $this->filters['value'], 'owner' => intval($this->filters['owner']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range = array( 'start' => 0, 'count' => 1000 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array( 'attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRecords'); // Call function $result = $this->SoapEngine->soapclient->getRecords($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { foreach ($result->records as $record) { $this->selectionKeys[]=array('id' => $record->id); } return true; } } function showRecord($record) { echo "

Record

"; printf("
", $_SERVER['PHP_SELF']); echo ""; printf( "
%s
", $record->name ); foreach (array_keys($this->Fields) as $item) { if (is_array($this->havePriority) && $item == 'priority' && !in_array($record->type,$this->havePriority)) { continue; } if ($this->Fields[$item]['name']) { $item_name = $this->Fields[$item]['name']; } else { $item_name = ucfirst($item); } if ($item == 'type') { $selected_type[$record->$item]='selected'; $select_box=sprintf(""; printf( "
%s
", $item_name, $select_box ); } else if ($this->Fields[$item]['type'] == 'text') { printf( "
", $item_name, $item, $record->$item ); } else { if ($record->type == 'NAPTR' and $item == 'value') { $help_text = 'Priority field will be used for the preference part of the value'; } else { $help_text = ''; } printf( "
", $item_name, $item, $record->$item ); if ($help_text) { printf("%s", $help_text); } echo "
"; } } printf("", $record->id); $this->printFiltersToForm(); $this->printHiddenFormElements(); echo "
"; echo "
"; } function getRecord($id) { // Filter if (!$id) { print "Error in getRecord(): Missing record id"; return false; } $filter = array('id' => $id); // Range $range = array( 'start' => 0, 'count' => 1 ); // Order $orderBy = array( 'attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action($this->getRecordsFunction); // Call function $result = call_user_func_array(array($this->SoapEngine->soapclient,$this->getRecordsFunction),array($Query)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { if ($result->records[0]){ return $result->records[0]; } else { return false; } } } function updateRecord () { //print "

Updating record ..."; if (!$_REQUEST['id_filter']) return; if (!$record = $this->getRecord(intval($_REQUEST['id_filter']))) { return false; } $record_old=$record; foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $record->$item = intval($_REQUEST[$var_name]); } else { $record->$item = trim($_REQUEST[$var_name]); } } $function=array('commit' => array('name' => $this->updateRecordFunction, 'parameters' => array($record), 'logs' => array('success' => sprintf('Record %s has been updated',$_REQUEST['id_filter']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function showTextBeforeCustomerSelection() { print _("Zone owner"); } } class FancyRecords extends DnsRecords { var $fancy = true; var $addRecordFunction = 'addFancyRecord'; var $deleteRecordFunction = 'deleteFancyRecord'; var $updateRecordFunction = 'updateFancyRecord'; var $getRecordsFunction = 'getFancyRecords'; var $getRecordFunction = 'getFancyRecord'; var $recordTypesTemplate=array(); var $Fields=array( 'type' => array('type'=>'string'), 'value' => array('type'=>'string') ); } class EmailAliases extends FancyRecords { var $recordTypes=array('MBOXFW' => 'Email alias'); var $typeFilter='MBOXFW'; } class UrlRedirect extends FancyRecords { var $recordTypes=array('URL' => 'URL forwarding'); var $typeFilter='URL'; } class TrustedPeers extends Records { var $FieldsAdminOnly=array( 'msteams' => array('type'=>'boolean', 'name' => 'MS Teams'), 'prepaid' => array('type'=>'boolean'), 'tenant' => array('type'=>'string'), 'callLimit' => array('type'=>'integer', 'name' => 'Capacity'), 'blocked' => array('type'=>'integer') ); var $Fields=array( 'description' => array('type'=>'string'), 'authToken' => array('type'=>'string', 'name' => 'Authentication token') ); function TrustedPeers($SoapEngine) { $this->filters = array('ip' => trim($_REQUEST['ip_filter']), 'tenant' => trim($_REQUEST['tenant_filter']), 'description' => trim($_REQUEST['description_filter']), 'msteams' => trim($_REQUEST['msteams_filter']) ); $this->Records($SoapEngine); $this->sortElements=array( 'changeDate' => 'Change date', 'description' => 'Description', 'ip' => 'Address' ); } function listRecords() { $this->showSeachForm(); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('ip' => $this->filters['ip'], 'description' => $this->filters['description'], 'tenant' => $this->filters['tenant'], 'msteams' => 1 == intval($this->filters['msteams']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'description'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getTrustedPeers'); $result = $this->SoapEngine->soapclient->getTrustedPeers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "

$this->rows records found
"; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->peers[$i]) break; $peer = $result->peers[$i]; $index=$this->next+$i+1; $delete_url = $this->url.sprintf("&service=%s&action=Delete&ip_filter=%s&msteams_filter=%s", urlencode($this->SoapEngine->service), urlencode($peer->ip), urlencode(intval($peer->msteams)) ); $update_url = $this->url.sprintf("&service=%s&ip_filter=%s&msteams_filter=%s", urlencode($this->SoapEngine->service), urlencode($peer->ip), urlencode($peer->msteams) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['ip_filter'] == $peer->ip) { $delete_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } if ($peer->msteams) { $msteams = 'Yes'; } else { $msteams = 'No'; } if ($peer->prepaid) { $prepaid = 'Yes'; } else { $prepaid = 'No'; } $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($peer->reseller) ); printf(" ", $index, $_customer_url, $peer->reseller, $update_url, $peer->ip, $prepaid, $peer->callLimit, $msteams, $peer->tenant, $peer->description, $peer->blocked, $peer->changeDate, $delete_url, $actionText ); $i++; } } print "
Id Owner Trusted peer Prepaid Capacity MS Teams Tenant Description Blocked Change date Actions
%s %s %s %s %s %s %s %s %s %s %s
"; if ($result->total == 1) { $this->showRecord($peer); } $this->showPagination($maxrows); return true; } } function showRecord($peer) { print ""; print "
"; printf ("",$_SERVER['PHP_SELF']); print ""; if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { if ($this->FieldsAdminOnly[$item]['name']) { $item_name=$this->FieldsAdminOnly[$item]['name']; } else { $item_name=ucfirst($item); } if ($this->FieldsAdminOnly[$item]['type'] == 'text') { printf ("", $item_name, $item, $peer->$item ); } else if ($this->FieldsAdminOnly[$item]['type'] == 'boolean') { if ($peer->$item == 1) { $checked = "checked"; } else { $checked = ""; } printf ("", $item_name, $item, $checked ); } else { printf ("", $item_name, $item, $peer->$item ); } } } foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } if ($this->Fields[$item]['type'] == 'text') { printf ("", $item_name, $item, $peer->$item ); } else if ($this->Fields[$item]['type'] == 'boolean') { if ($peer->$item == 1) { $checked = "checked"; } else { $checked = ""; } printf ("", $item_name, $item, $checked ); } else { printf ("", $item_name, $item, $peer->$item ); } } print ""; printf ("",$peer->ip); $this->printFiltersToForm(); $this->printHiddenFormElements(); print ""; print "
%s
%s
%s
%s
%s
%s
"; } function showAddForm() { //if ($this->selectionActive) return; printf ("
",$_SERVER['PHP_SELF']); print "
"; print " "; $this->showCustomerTextBox(); if ($this->filters['msteams']) { $checked = 'checked'; } else { $checked = ''; } printf ("
Address
"); printf ("
Call limit
"); printf ("
Description
"); printf ("
Tenant
", $this->filters['tenant']); printf ("
MS Teams
", $checked); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['ipaddress']) { $ipaddress = $dictionary['ipaddress']; } else { $ipaddress = trim($_REQUEST['ipaddress']); } if ($dictionary['msteams']) { $msteams = $dictionary['msteams']; } else { $msteams = trim($_REQUEST['msteams']); } $this->filters['msteams'] = $msteams; if ($dictionary['description']) { $description = $dictionary['description']; } else { $description = trim($_REQUEST['description']); } if ($dictionary['tenant']) { $tenant = $dictionary['tenant']; } else { $tenant = trim($_REQUEST['tenant']); } if ($dictionary['callLimit']) { $callLimit = $dictionary['callLimit']; } else { $callLimit = trim($_REQUEST['callLimit']); } if ($dictionary['owner']) { $owner = $dictionary['owner']; } else { $owner = trim($_REQUEST['owner']); } list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!strlen($ipaddress)) { printf ("

Error: Missing IP or description. "); return false; } $peer=array( 'ip' => $ipaddress, 'description' => $description, 'callLimit' => intval($callLimit), 'msteams' => 1 == $msteams, 'tenant' => $tenant, 'blocked' => 0, 'owner' => intval($_REQUEST['owner']), 'customer' => intval($customer), 'reseller' => intval($reseller) ); $function=array('commit' => array('name' => 'addTrustedPeer', 'parameters' => array($peer), 'logs' => array('success' => sprintf('Trusted peer %s has been added',$ipaddress))) ); return $this->SoapEngine->execute($function,$this->html); } function updateRecord() { list($customer,$reseller)=$this->customerFromLogin($dictionary); if (!strlen($this->filters['ip'])) { print "

Error: missing peer address. "; return false; } $peer=array( 'ip' => $this->filters['ip'], 'description' => $_REQUEST['description_form'], 'authToken' => $_REQUEST['authToken_form'], 'tenant' => $_REQUEST['tenant_form'], 'callLimit' => intval($_REQUEST['callLimit_form']), 'prepaid' => 1 == $_REQUEST['prepaid_form'], 'blocked' => intval($_REQUEST['blocked_form']), 'msteams' => 1 == $_REQUEST['msteams_form'], 'customer' => intval($customer), 'reseller' => intval($reseller) ); $function=array('commit' => array('name' => 'updateTrustedPeer', 'parameters' => array($peer), 'logs' => array('success' => sprintf('Trusted peer %s has been updated',$this->filters['ip']))) ); return $this->SoapEngine->execute($function,$this->html); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if (!strlen($this->filters['ip'])) { print "

Error: missing IP address. "; return false; } $function=array('commit' => array('name' => 'deleteTrustedPeer', 'parameters' => array($this->filters['ip']), 'logs' => array('success' => sprintf('Trusted peer %s has been deleted',$this->filters['ip']))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { if (intval($this->filters['msteams']) == 1) { $checked_msteams = 'checked'; } else { $checked_msteams = ''; } printf ("

Address
",$this->filters['ip']); printf ("
Description
",$this->filters['description']); printf ("
Tenant
",$this->filters['tenant']); printf ("
Blocked
",$this->filters['blocked']); printf ("
MS Teams
",$checked_msteams); } function showCustomerTextBox () { print "
Owner"; $this->showResellerForm('reseller'); print "
"; } function showTextBeforeCustomerSelection() { print "Owner"; } function showCustomerForm($name='customer_filter') { } } class Carriers extends Records { var $carriers=array(); var $Fields=array( 'id' => array('type'=>'integer', 'readonly' => true), 'name' => array('type'=>'string') ); var $sortElements=array( 'changeDate' => 'Change date', 'name' => 'Carrier' ); function Carriers($SoapEngine) { $this->filters = array('id' => trim($_REQUEST['id_filter']), 'name' => trim($_REQUEST['name_filter']) ); $this->Records($SoapEngine); } function showCustomerTextBox () { print "Reseller"; print ""; $this->showResellerForm('reseller'); print ""; } function listRecords() { $this->showSeachForm(); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array( 'id' => intval($this->filters['id']), 'name' => $this->filters['name'], 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getCarriers'); $result = $this->SoapEngine->soapclient->getCarriers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; print "
$this->rows records found

"; print " "; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->carriers[$i]) break; $carrier = $result->carriers[$i]; $index=$this->next+$i+1; $_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%s", urlencode($this->SoapEngine->service), urlencode($carrier->id) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['id_filter'] == $carrier->id) { $_delete_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_url = $this->url.sprintf("&service=%s&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->service), urlencode($carrier->id), urlencode($carrier->reseller) ); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($carrier->reseller) ); $_gateway_url = $this->url.sprintf("&service=pstn_gateways@%s&carrier_id_filter=%d&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($carrier->id), urlencode($carrier->reseller) ); printf(" ", $index, $_customer_url, $carrier->reseller, $_url, $carrier->id, $carrier->name, $_gateway_url, $carrier->changeDate, $_delete_url, $actionText ); printf(" "); $i++; } } print "
Id Owner Carrier Name Gateways Change date Actions
%s %s %s %s Gateways %s %s
"; if ($this->rows == 1) { $this->showRecord($carrier); } else { $this->showPagination($maxrows); } return true; } } function showAddForm() { //if ($this->selectionActive) return; printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; print "
"; $this->showCustomerTextBox(); printf ("
Name
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['name']) { $name=$dictionary['name']; } else { $name = trim($_REQUEST['name']); } list($customer,$reseller)=$this->customerFromLogin($dictionary); $structure=array('name' => $name, 'reseller' => intval($reseller) ); if (!strlen($name)) { printf ("

Error: Missing name. "); return false; } $function=array('commit' => array('name' => 'addCarrier', 'parameters' => array($structure), 'logs' => array('success' => sprintf('Carrier %s has been added',$name))) ); return $this->SoapEngine->execute($function,$this->html); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['id']) { $id = $dictionary['id']; } else { $id = trim($this->filters['id']); } if (!strlen($id)) { print "

Error: missing carrier id "; return false; } $function=array('commit' => array('name' => 'deleteCarrier', 'parameters' => array(intval($id)), 'logs' => array('success' => sprintf('Carrier %d has been deleted',$id))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

Carrier
",$this->filters['id']); printf ("
Name
",$this->filters['name']); } function showCustomerForm($name='customer_filter') { } function showTextBeforeCustomerSelection() { print "Owner"; } function getRecord($id) { // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($id)); // Range $range=array('start' => 0, 'count' => 1 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'name'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getCarriers'); $result = $this->SoapEngine->soapclient->getCarriers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->carriers[0]){ return $result->carriers[0]; } else { return false; } } } function showRecord($carrier) { print "

Carrier

"; printf ("
",$_SERVER['PHP_SELF']); print ""; foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } printf ("
", $item_name ); if ($this->Fields[$item]['readonly']) { printf ("
%s
", $item, $carrier->$item, $carrier->$item ); } else { printf ("
", $item, $carrier->$item ); } print " "; } printf ("",$carier->id); $this->printFiltersToForm(); $this->printHiddenFormElements(); print "
"; print ""; } function updateRecord () { //print "

Updating carrier ..."; if (!$_REQUEST['id_filter']) return; if (!$carrier = $this->getRecord($_REQUEST['id_filter'])) { return false; } foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; if ($this->Fields[$item]['type'] == 'integer') { $carrier->$item = intval($_REQUEST[$var_name]); } else { $carrier->$item = trim($_REQUEST[$var_name]); } } $function=array('commit' => array('name' => 'updateCarrier', 'parameters' => array($carrier), 'logs' => array('success' => sprintf('Carrier %d has been updated',$_REQUEST['id_filter']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result) ; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } } class Gateways extends Records { var $carriers=array(); var $FieldsReadOnly=array( 'reseller', 'changeDate' ); var $Fields=array( 'id' => array('type'=>'integer', 'readonly' => true), 'name' => array('type'=>'string'), 'carrier_id' => array('type'=>'integer'), 'transport' => array('type'=>'string'), 'ip' => array('name'=>'IP or hostname', 'type'=>'string'), 'port' => array('type'=>'integer') ); //var $transports=array('udp','tcp','tls'); var $transports=array('udp'); function Gateways($SoapEngine) { $this->filters = array( 'id' => trim($_REQUEST['id_filter']), 'name' => trim($_REQUEST['name_filter']), 'carrier_id' => trim($_REQUEST['carrier_id_filter']) ); $this->sortElements=array( 'changeDate' => 'Change date', 'name' => 'Gateway', 'carrier_id' => 'Carrier', 'ip' => 'Address' ); $this->Records($SoapEngine); } function listRecords() { $this->getCarriers(); $this->showSeachForm(); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($this->filters['id']), 'name' => $this->filters['name'], 'carrier_id'=> intval($this->filters['carrier_id']), 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getGateways'); $result = $this->SoapEngine->soapclient->getGateways($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; print "

$this->rows records found

"; print " "; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->gateways[$i]) break; $gateway = $result->gateways[$i]; $index=$this->next+$i+1; $_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%s", urlencode($this->SoapEngine->service), urlencode($gateway->id) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['id_filter'] == $gateway->id) { $_delete_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_url = $this->url.sprintf("&service=%s&id_filter=%s", urlencode($this->SoapEngine->service), urlencode($gateway->id) ); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($gateway->reseller) ); $_carrier_url = $this->url.sprintf("&service=pstn_carriers@%s&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($gateway->carrier_id), urlencode($gateway->reseller) ); $_rules_url = $this->url.sprintf("&service=gateway_rules@%s&gateway_id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($gateway->id), urlencode($gateway->reseller) ); $_r=0; printf(" ", $index, $_customer_url, $gateway->reseller, $_url, $gateway->id, $_carrier_url, $gateway->carrier, $gateway->name, $gateway->transport, $gateway->ip, $gateway->port, $_rules_url, $gateway->changeDate, $_delete_url, $actionText ); printf(" "); $i++; } } print "
Id Owner Gateway Carrier Name Address Rules Change date Actions
%s %s %s %s %s %s:%s:%s Rules %s %s
"; if ($this->rows == 1) { $this->showRecord($gateway); } else { $this->showPagination($maxrows); } return true; } } function showAddForm() { //if ($this->selectionActive) return; $this->getCarriers(); if (!count($this->carriers)) { print "

Create a carrier first"; return false; } printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; printf (" Carrier "); print ""); printf ("
Name
"); printf ("
Transport"); print "
"); printf ("
Address
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['name']) { $name = $dictionary['name']; } else { $name = trim($_REQUEST['name']); } if ($dictionary['carrier_id']) { $carrier_id = $dictionary['carrier_id']; } else { $carrier_id = trim($_REQUEST['carrier_id']); } if ($dictionary['address']) { $address = $dictionary['address']; } else { $address = trim($_REQUEST['address']); } if ($dictionary['transport']) { $transport = $dictionary['transport']; } else { $transport = trim($_REQUEST['transport']); } if (!strlen($name) || !strlen($carrier_id) || !strlen($address)) { printf ("

Error: Missing gateway name, carrier_id or address"); return false; } $address_els=explode(':',$address); if (count($address_els) == 1) { $ip = $address_els[0]; $port ='5060'; } else if (count($address_els) == 2) { $ip = $address_els[0]; $port = $address_els[1]; } if (!$port) $port = 5060; if (!in_array($transport,$this->transports)) { $transport=$this->transports[0]; } $gateway=array( 'name' => $name, 'carrier_id' => intval($carrier_id), 'ip' => $ip, 'port' => intval($port), 'transport' => $transport ); $function=array('commit' => array('name' => 'addGateway', 'parameters' => array($gateway), 'logs' => array('success' => sprintf('Gateway %s has been added',$name))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['id']) { $id = $dictionary['id']; } else { $id = trim($this->filters['id']); } if (!strlen($id)) { print "

Error: missing gateway id. "; return false; } $function=array('commit' => array('name' => 'deleteGateway', 'parameters' => array(intval($id)), 'logs' => array('success' => sprintf('Gateway %d has been deleted',$id))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

Gateway
",$this->filters['id']); print " "); printf ("
Name
",$this->filters['name']); } function showCustomerForm($name='customer_filter') { } function showTextBeforeCustomerSelection() { print "Owner"; } function showRecord($gateway) { print "

Gateway

"; printf ("
",$_SERVER['PHP_SELF']); print ""; foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } printf ("
", $item_name ); if ($this->Fields[$item]['readonly']) { printf ("
%s
", $item, $gateway->$item, $gateway->$item ); } else { if ($item == 'carrier_id') { printf ("
"); } else if ($item == 'transport') { printf ("
"; } else { printf ("
", $item, $gateway->$item ); } } print "
"; } printf ("",$gateway->id); $this->printFiltersToForm(); $this->printHiddenFormElements(); print "
"; print "
"; } function updateRecord () { //print "

Updating gateway ..."; if (!$_REQUEST['id_filter']) return; if (!$gateway = $this->getRecord($_REQUEST['id_filter'])) { return false; } foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; if ($this->Fields[$item]['type'] == 'integer') { $gateway->$item = intval($_REQUEST[$var_name]); } else { $gateway->$item = trim($_REQUEST[$var_name]); } } if (!in_array($gateway->transport,$this->transports)) { printf ("Invalid transport '%s'",$gateway->transport); return false; } $function=array('commit' => array('name' => 'updateGateway', 'parameters' => array($gateway), 'logs' => array('success' => sprintf('Gateway %s has been updated',$_REQUEST['name_filter']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result) ; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function getRecord($id) { // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($id)); // Range $range=array('start' => 0, 'count' => 1 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'name'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getGateways'); $result = $this->SoapEngine->soapclient->getGateways($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->gateways[0]){ return $result->gateways[0]; } else { return false; } } } } class GatewayRules extends Records { var $carriers=array(); var $FieldsReadOnly=array( 'reseller', 'changeDate' ); var $Fields=array( 'id' => array('type'=>'integer','readonly' => true), 'gateway_id' => array('type'=>'integer','name' => 'Gateway'), 'prefix' => array('type'=>'string'), 'strip' => array('type'=>'integer'), 'prepend' => array('type'=>'string'), 'minLength' => array('type'=>'integer'), 'maxLength' => array('type'=>'integer') ); function GatewayRules($SoapEngine) { $this->filters = array('id' => trim($_REQUEST['id_filter']), 'gateway_id' => trim($_REQUEST['gateway_id_filter']), 'carrier_id' => trim($_REQUEST['carrier_id_filter']), 'prefix' => trim($_REQUEST['prefix_filter']), ); $this->sortElements=array( 'changeDate' => 'Change date', 'gateway' => 'Gateway', 'carrier' => 'Carrier', 'prefix' => 'Prefix' ); $this->Records($SoapEngine); } function listRecords() { $this->getCarriers(); $this->showSeachForm(); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($this->filters['id']), 'gateway_id' => intval($this->filters['gateway_id']), 'carrier_id' => intval($this->filters['carrier_id']), 'prefix' => $this->filters['prefix'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->log_action('getGatewayRules'); $result = $this->SoapEngine->soapclient->getGatewayRules($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; print "

$this->rows records found

"; print " "; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->gateway_rules[$i]) break; $gateway_rule = $result->gateway_rules[$i]; $index=$this->next+$i+1; $_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->service), urlencode($gateway_rule->id), urlencode($gateway_rule->reseller) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['id_filter'] == $gateway_rule->id) { $_delete_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_url = $this->url.sprintf("&service=%s&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->service), urlencode($gateway_rule->id), urlencode($gateway_rule->reseller) ); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($gateway_rule->reseller) ); $_carrier_url = $this->url.sprintf("&service=pstn_carriers@%s&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($gateway_rule->carrier_id), urlencode($gateway_rule->reseller) ); $_gateway_url = $this->url.sprintf("&service=pstn_gateways@%s&id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($gateway_rule->gateway_id), urlencode($gateway_rule->reseller) ); printf(" ", $index, $_customer_url, $gateway_rule->reseller, $_url, $gateway_rule->id, $_carrier_url, $gateway_rule->carrier,$gateway_rule->carrier_id, $_gateway_url, $gateway_rule->gateway,$gateway_rule->gateway_id, $gateway_rule->prefix, $gateway_rule->strip, $gateway_rule->prepend, $gateway_rule->minLength, $gateway_rule->maxLength, $gateway_rule->changeDate, $_delete_url, $actionText ); printf(" "); $i++; } } print "
Owner Rule Carrier Gateway Prefix Strip Prepend MinLength MaxLength Change date Actions
%s %s %s %s (%d) %s (%d) %s %s %s %s %s %s %s
"; if ($this->rows == 1) { $this->showRecord($gateway_rule); } else { $this->showPagination($maxrows); } return true; } } function showAddForm() { //if ($this->selectionActive) return; $this->getGateways(); if (!count($this->gateways)) { print "

Create a gateway first"; return false; } printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; print "
Gateway
"); printf ("
Prefix
"); printf ("
Strip
"); printf ("
Prepend
"); printf ("
Min length
"); printf ("
Max length
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['gateway_id']) { $gateway_id = $dictionary['gateway_id']; } else { $gateway_id = trim($_REQUEST['gateway_id']); } if ($dictionary['prefix']) { $prefix = $dictionary['prefix']; } else { $prefix = trim($_REQUEST['prefix']); } if ($dictionary['strip']) { $strip = $dictionary['strip']; } else { $strip = trim($_REQUEST['strip']); } if ($dictionary['prepend']) { $prepend = $dictionary['prepend']; } else { $prepend = trim($_REQUEST['prepend']); } if ($dictionary['minLength']) { $minLength = $dictionary['minLength']; } else { $minLength = trim($_REQUEST['minLength']); } if ($dictionary['maxLength']) { $maxLength = $dictionary['maxLength']; } else { $maxLength = trim($_REQUEST['maxLength']); } if (!strlen($gateway_id)) { printf ("

Error: Missing gateway id"); return false; } $rule=array( 'gateway_id' => intval($gateway_id), 'prefix' => $prefix, 'prepend' => $prepend, 'strip' => intval($strip), 'minLength' => intval($minLength), 'maxLength' => intval($maxLength) ); $function=array('commit' => array('name' => 'addGatewayRule', 'parameters' => array($rule), 'logs' => array('success' => sprintf('Gateway rule has been added'))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['id']) { $id = $dictionary['id']; } else { $id = trim($this->filters['id']); } if (!strlen($id)) { print "

Error: missing rule id "; return false; } $function=array('commit' => array('name' => 'deleteGatewayRule', 'parameters' => array(intval($id)), 'logs' => array('success' => sprintf('Gateway rule %d has been deleted',$id))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

Rule
",$this->filters['id']); print " "); printf ("
Gateway
",$this->filters['gateway_id']); printf ("
Prefix
",$this->filters['prefix']); } function showCustomerForm($name='customer_filter') { } function showTextBeforeCustomerSelection() { print "Owner"; } function showRecord($rule) { $this->getGateways(); print "

Rule

"; printf ("
",$_SERVER['PHP_SELF']); print ""; foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } printf ("
", $item_name ); if ($this->Fields[$item]['readonly']) { printf ("
%s
", $item, $rule->$item, $rule->$item ); } else { if ($item == 'gateway_id') { printf ("
"; } else { printf ("
", $item, $rule->$item ); } } print "
"; } printf ("",$rule->reseller); $this->printFiltersToForm(); $this->printHiddenFormElements(); print "
"; print "
"; } function updateRecord () { //print "

Updating rule ..."; if (!$_REQUEST['id_form'] || !strlen($_REQUEST['reseller_filter'])) { return; } if (!$rule = $this->getRecord($_REQUEST['id_form'])) { return false; } foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; if ($this->Fields[$item]['type'] == 'integer') { $rule->$item = intval($_REQUEST[$var_name]); } else { $rule->$item = trim($_REQUEST[$var_name]); } } $function=array('commit' => array('name' => 'updateGatewayRule', 'parameters' => array($rule), 'logs' => array('success' => sprintf('Rule %d has been updated',$_REQUEST['id_form']))) ); $result = $this->SoapEngine->execute($function,$this->html); dprint_r($result) ; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } function getRecord($id) { // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($id)); // Range $range=array('start' => 0, 'count' => 1 ); // Order $this->sorting['sortBy'] = 'gateway'; $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getGatewayRules'); $result = $this->SoapEngine->soapclient->getGatewayRules($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->gateway_rules[0]){ return $result->gateway_rules[0]; } else { return false; } } } } class Routes extends Records { var $carriers=array(); var $Fields=array( 'id' => array('type'=>'integer', 'readonly' => true), 'carrier_id' => array('type'=>'integer','name'=>'Carrier'), 'prefix' => array('type'=>'string'), 'originator' => array('type'=>'string'), 'priority' => array('type'=>'integer') ); var $sortElements=array( 'prefix' => 'Prefix', 'priority' => 'Priority' ); function Routes($SoapEngine) { $this->filters = array('prefix' => trim($_REQUEST['prefix_filter']), 'priority' => trim($_REQUEST['priority_filter']), 'carrier_id'=> trim($_REQUEST['carrier_id_filter']), 'reseller' => trim($_REQUEST['reseller_filter']), 'id' => trim($_REQUEST['id_filter']) ); $this->Records($SoapEngine); } function listRecords() { $this->getCarriers(); $this->showSeachForm(); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('prefix' => $this->filters['prefix'], 'carrier_id' => intval($this->filters['carrier_id']), 'reseller' => intval($this->filters['reseller']), 'id' => intval($this->filters['id']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'prefix'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getRoutes'); $result = $this->SoapEngine->soapclient->getRoutes($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; print "

$this->rows records found

"; print " "; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->routes[$i]) break; $route = $result->routes[$i]; $index=$this->next+$i+1; $_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%d", urlencode($this->SoapEngine->service), urlencode($route->id) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['id_filter'] == $route->id) { $_delete_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_url = $this->url.sprintf("&service=%s&id_filter=%d", urlencode($this->SoapEngine->service), urlencode($route->id) ); $_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", urlencode($this->SoapEngine->customer_engine), urlencode($route->reseller) ); $_carrier_url = $this->url.sprintf("&service=pstn_carriers@%s&id_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($route->carrier_id) ); $_gateway_url = $this->url.sprintf("&service=pstn_gateways@%s&carrier_id_filter=%s&reseller_filter=%s", urlencode($this->SoapEngine->soapEngine), urlencode($route->carrier_id), urlencode($route->reseller) ); printf(" ", $index, $_customer_url, $route->reseller, $_url, $route->id, $_carrier_url, $route->carrier, $_gateway_url, $route->prefix, $route->originator, $route->priority, $route->changeDate, $_delete_url, $actionText ); printf(" "); $i++; } } print "
Id Owner Route Carrier Gateways Prefix Originator Priority Change date Actions
%s %s %s %s Gateways %s %s %s %s %s
"; if ($this->rows == 1) { $this->showRecord($route); } else { $this->showPagination($maxrows); } return true; } } function showAddForm() { //if ($this->selectionActive) return; if (!count($this->carriers)) { print "

Create a carrier first"; return false; } printf ("

",$_SERVER['PHP_SELF']); print " "; print "
"; printf (" Carrier "); print ""; print "
"); printf ("
Prefix
"); printf ("
Originator
"); printf ("
Priority
"); $this->printHiddenFormElements(); print "
"; } function addRecord($dictionary=array()) { if ($dictionary['prefix']) { $prefix = $dictionary['prefix']; } else { $prefix = trim($_REQUEST['prefix']); } if ($dictionary['carrier_id']) { $carrier_id = $dictionary['carrier_id']; } else { $carrier_id = trim($_REQUEST['carrier_id']); } if ($dictionary['originator']) { $originator = $dictionary['originator']; } else { $originator = trim($_REQUEST['originator']); } if ($dictionary['priority']) { $priority = $dictionary['priority']; } else { $priority = trim($_REQUEST['priority']); } if (!strlen($carrier_id)) { printf ("

Error: Missing carrier id. "); return false; } $route=array( 'prefix' => $prefix, 'originator' => $originator, 'carrier_id' => intval($carrier_id), 'priority' => intval($priority) ); $routes=array($route); $function=array('commit' => array('name' => 'addRoutes', 'parameters' => array($routes), 'logs' => array('success' => sprintf('Route %s has been added',$prefix))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function deleteRecord($dictionary=array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['id']) { $id = $dictionary['id']; } else { $id = trim($this->filters['id']); } if (!strlen($id)) { print "

Error: missing route id. "; return false; } $route=array('id'=> intval($id)); $routes=array($route); $function=array('commit' => array('name' => 'deleteRoutes', 'parameters' => array($routes), 'logs' => array('success' => sprintf('Route %s has been deleted',$prefix))) ); unset($this->filters); return $this->SoapEngine->execute($function,$this->html); } function showSeachFormCustom() { printf ("

Route
",$this->filters['id']); print " "; printf ("
Prefix
",$this->filters['prefix']); } function showCustomerTextBox () { print "Owner"; $this->showResellerForm('reseller'); } function showCustomerForm($name='customer_filter') { } function showTextBeforeCustomerSelection() { print "Owner"; } function getRecord($id) { // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Filter $filter=array('id' => intval($id)); // Range $range=array('start' => 0, 'count' => 1 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'prefix'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $this->log_action('getRoutes'); $result = $this->SoapEngine->soapclient->getRoutes($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if ($result->routes[0]){ return $result->routes[0]; } else { return false; } } } function showRecord($route) { print "

Route

"; printf ("
",$_SERVER['PHP_SELF']); print ""; foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } printf ("
", $item_name ); if ($this->Fields[$item]['readonly']) { printf ("
%s
", $item, $route->$item, $route->$item ); } else { if ($item == 'carrier_id') { printf ("
"); } else { printf ("
", $item, $route->$item ); } } print "
"; } printf ("",$carier->id); $this->printFiltersToForm(); $this->printHiddenFormElements(); print "
"; print "
"; } function updateRecord () { //print "

Updating route ..."; if (!$_REQUEST['id_filter']) return; if (!$route = $this->getRecord($_REQUEST['id_filter'])) { return false; } foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; if ($this->Fields[$item]['type'] == 'integer') { $route->$item = intval($_REQUEST[$var_name]); } else { $route->$item = trim($_REQUEST[$var_name]); } } $routes=array($route); $function=array('commit' => array('name' => 'updateRoutes', 'parameters' => array($routes), 'logs' => array('success' => sprintf('Route %d has been updated',$_REQUEST['id_filter']))) ); $result = $this->SoapEngine->execute($function,$this->html); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return true; } } } class Customers extends Records { var $children = array(); var $showAddForm = false; var $sortElements = array( 'changeDate' => 'Change date', 'username' => 'Username', 'firstName' => 'First name', 'lastName' => 'Last name', 'organization' => 'Organization', 'customer' => 'Customer' ); var $propertiesItems = array('sip_credit' => array('name' => 'Credit for SIP accounts', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'sip_alias_credit' => array('name' => 'Credit for SIP aliases', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'enum_range_credit' => array('name' => 'Credit for ENUM ranges', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'enum_number_credit' => array('name' => 'Credit for ENUM numbers', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'dns_zone_credit' => array('name' => 'Credit for DNS zones', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'email_credit' => array('name' => 'Credit for E-mail aliases', 'category' => 'credit', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'pstn_access' => array('name' => 'Access to PSTN', 'category' => 'sip', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'prepaid_changes' => array('name' => 'Prepaid Changes', 'category' => 'sip', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'pstn_changes' => array('name' => 'Pstn Changes', 'category' => 'sip', 'permission' => 'admin', 'resellerMayManageForChildAccounts' => true ), 'payment_processor_class' => array('name' => 'Payment Processor Class', 'category' => 'sip', 'permission' => 'admin' ), 'voicemail_server' => array('name' => 'Voicemail Server Address', 'category' => 'sip', 'permission' => 'customer' ), 'voicemail_access_number' => array('name' => 'Voicemail Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'FUNC_access_number' => array('name' => 'Forwarding Unconditional Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'FNOL_access_number' => array('name' => 'Forwarding Not-Online Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'FNOA_access_number' => array('name' => 'Forwarding Not-Available Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'FBUS_access_number' => array('name' => 'Forwarding On Busy Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'change_privacy_access_number' => array('name' => 'Change privacy Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'check_privacy_access_number' => array('name' => 'Check privacy Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'reject_anonymous_access_number' => array('name' => 'Reject anonymous Access Number', 'category' => 'sip', 'permission' => 'customer' ), 'sip_proxy' => array('name' => 'SIP Proxy Address', 'category' => 'sip', 'permission' => 'customer' ), 'sip_outbound_proxy' => array('name' => 'SIP Client Outbound proxy', 'category' => 'sip', 'permission' => 'customer' ), 'store_clear_text_passwords' => array('name' => 'Store clear text passwords', 'category' => 'sip', 'permission' => 'customer' ), 'xcap_root' => array('name' => 'XCAP Root URL', 'category' => 'sip', 'permission' => 'customer' ), 'absolute_voicemail_uri'=> array('name' => 'Use Absolute Voicemail Uri', 'category' => 'sip', 'permission' => 'customer' ), 'dns_admin_email' => array('name' => 'DNS zones Administrator Email', 'category' => 'dns', 'permission' => 'customer'), 'support_web' => array('name' => 'Support Web Site', 'category' => 'sip', 'permission' => 'customer' ), 'support_email' => array('name' => 'Support Email Address', 'category' => 'sip', 'permission' => 'customer' ), 'billing_email' => array('name' => 'Billing Email Address', 'category' => 'sip', 'permission' => 'customer' ), 'support_company' => array('name' => 'Support Organization', 'category' => 'sip', 'permission' => 'customer' ), 'cdrtool_address' => array('name' => 'CDRTool Address', 'category' => 'sip', 'permission' => 'customer' ), 'sip_settings_page' => array('name' => 'SIP Settings Page', 'category' => 'sip', 'permission' => 'customer' ), 'digest_settings_page' => array('name' => 'Settings Page (Digest Auth)', 'category' => 'sip', 'permission' => 'reseller' ), 'records_per_page' => array('name' => 'Records per page', 'category' => 'web', 'permission' => 'customer' ), 'push_notifications_server' => array('name'=>'Push server public interface', 'category' =>'sip', 'permission' => 'customer' ), 'push_notifications_server_private' => array('name'=>'Push server private interface', 'category' =>'sip', 'permission' => 'customer' ) ); var $FieldsReadOnly=array( 'id' => array('type'=>'integer'), 'reseller' => array('type'=>'integer') ); var $Fields=array( 'resellerActive' => array ('type' => 'boolean', 'name' => 'Reseller active', 'adminonly' => true ), 'impersonate' => array('type' =>'integer', 'name' =>'Impersonate'), 'companyCode' => array('type' =>'text', 'name' =>'Company code', 'adminonly' => true ), 'balance' => array('type' => 'float', 'adminonly' => true ), 'credit' => array('type' => 'float', 'adminonly' => true ), 'username' => array('type' =>'text', 'extra_html' => 'readonly autocomplete="off"' ), 'password' => array('type'=>'text', 'name'=>'Password'), 'firstName' => array('type'=>'text', 'name'=>'First name'), 'lastName' => array('type'=>'text', 'name'=>'Last name'), 'organization'=> array('type'=>'text'), 'tel' => array('type'=>'text'), 'fax' => array('type'=>'text'), 'sip' => array('type'=>'text'), 'enum' => array('type'=>'text'), 'mobile' => array('type'=>'text'), 'email' => array('type'=>'text'), 'web' => array('type'=>'text'), 'address' => array('type'=>'textarea'), 'postcode' => array('type'=>'text'), 'city' => array('type'=>'text'), 'state' => array('type'=>'text'), 'country' => array('type'=>'text'), 'timezone' => array('type'=>'text'), 'language' => array('type'=>'text'), 'vatNumber' => array('type'=>'text', 'name'=>'VAT number'), 'bankAccount' => array('type'=>'text', 'name'=>'Bank account' ), 'billingEmail' => array('type'=>'text', 'name'=>'Billing email' ), 'billingAddress' => array('type'=>'textarea', 'name'=>'Billing address' ), ); var $addFields=array( 'username' => array('type' =>'text' ), 'password' => array('type'=>'text', 'name'=>'Password'), 'firstName' => array('type'=>'text', 'name'=>'First name'), 'lastName' => array('type'=>'text', 'name'=>'Last name'), 'organization'=> array('type'=>'text'), 'tel' => array('type'=>'text'), 'email' => array('type'=>'text'), 'address' => array('type'=>'textarea'), 'postcode' => array('type'=>'text'), 'city' => array('type'=>'text'), 'state' => array('type'=>'text'), 'country' => array('type'=>'text'), 'timezone' => array('type'=>'text') ); var $states=array( array("label"=>"", "value"=>"N/A"), array("label"=>"-- CANADA --", "value"=>"-"), array("label"=>"Alberta", "value"=>"AB"), array("label"=>"British Columbia", "value"=>"BC"), array("label"=>"Manitoba", "value"=>"MB"), array("label"=>"New Brunswick", "value"=>"NB"), array("label"=>"Newfoundland/Labrador", "value"=>"NL"), array("label"=>"Northwest Territory", "value"=>"NT"), array("label"=>"Nova Scotia", "value"=>"NS"), array("label"=>"Nunavut", "value"=>"NU"), array("label"=>"Ontario", "value"=>"ON"), array("label"=>"Prince Edward Island", "value"=>"PE"), array("label"=>"Quebec", "value"=>"QC"), array("label"=>"Saskatchewan", "value"=>"SN"), array("label"=>"Yukon", "value"=>"YT"), array("label"=>"---- US -----", "value"=>"-"), array("label"=>"Alabama", "value"=>"AL"), array("label"=>"Alaska", "value"=>"AK"), array("label"=>"American Samoa", "value"=>"AS"), array("label"=>"Arizona", "value"=>"AZ"), array("label"=>"Arkansas", "value"=>"AR"), array("label"=>"California", "value"=>"CA"), array("label"=>"Canal Zone", "value"=>"CZ"), array("label"=>"Colorado", "value"=>"CO"), array("label"=>"Connecticut", "value"=>"CT"), array("label"=>"Delaware", "value"=>"DE"), array("label"=>"District of Columbia", "value"=>"DC"), array("label"=>"Florida", "value"=>"FL"), array("label"=>"Georgia", "value"=>"GA"), array("label"=>"Guam", "value"=>"GU"), array("label"=>"Hawaii", "value"=>"HI"), array("label"=>"Idaho", "value"=>"ID"), array("label"=>"Illinois", "value"=>"IL"), array("label"=>"Indiana", "value"=>"IN"), array("label"=>"Iowa", "value"=>"IA"), array("label"=>"Kansas", "value"=>"KS"), array("label"=>"Kentucky", "value"=>"KY"), array("label"=>"Louisiana", "value"=>"LA"), array("label"=>"Maine", "value"=>"ME"), array("label"=>"Mariana Islands", "value"=>"MP"), array("label"=>"Maryland", "value"=>"MD"), array("label"=>"Massachusetts", "value"=>"MA"), array("label"=>"Michigan", "value"=>"MI"), array("label"=>"Minnesota", "value"=>"MN"), array("label"=>"Mississippi", "value"=>"MS"), array("label"=>"Missouri", "value"=>"MO"), array("label"=>"Montana", "value"=>"MT"), array("label"=>"Nebraska", "value"=>"NE"), array("label"=>"Nevada", "value"=>"NV"), array("label"=>"New Hampshire", "value"=>"NH"), array("label"=>"New Jersey", "value"=>"NJ"), array("label"=>"New Mexico", "value"=>"NM"), array("label"=>"New York", "value"=>"NY"), array("label"=>"North Carolina", "value"=>"NC"), array("label"=>"North Dakota", "value"=>"ND"), array("label"=>"Ohio", "value"=>"OH"), array("label"=>"Oklahoma", "value"=>"OK"), array("label"=>"Oregon", "value"=>"OR"), array("label"=>"Pennsylvania", "value"=>"PA"), array("label"=>"Puerto Rico", "value"=>"PR"), array("label"=>"Rhode Island", "value"=>"RI"), array("label"=>"South Carolina", "value"=>"SC"), array("label"=>"South Dakota", "value"=>"SD"), array("label"=>"Tennessee", "value"=>"TN"), array("label"=>"Texas", "value"=>"TX"), array("label"=>"Utah", "value"=>"UT"), array("label"=>"Vermont", "value"=>"VT"), array("label"=>"Virgin Islands", "value"=>"VI"), array("label"=>"Virginia", "value"=>"VA"), array("label"=>"Washington", "value"=>"WA"), array("label"=>"West Virginia", "value"=>"WV"), array("label"=>"Wisconsin", "value"=>"WI"), array("label"=>"Wyoming", "value"=>"WY"), array("label"=>"APO", "value"=>"AP"), array("label"=>"AEO", "value"=>"AE"), array("label"=>"AAO", "value"=>"AA"), array("label"=>"FPO", "value"=>"FP") ); var $countries=array( array("label"=>"Ascension Island", "value"=>"AC"), array("label"=>"Afghanistan", "value"=>"AF"), array("label"=>"Albania", "value"=>"AL"), array("label"=>"Algeria", "value"=>"DZ"), array("label"=>"American Samoa", "value"=>"AS"), array("label"=>"Andorra", "value"=>"AD"), array("label"=>"Angola", "value"=>"AO"), array("label"=>"Anguilla", "value"=>"AI"), array("label"=>"Antarctica", "value"=>"AQ"), array("label"=>"Antigua And Barbuda", "value"=>"AG"), array("label"=>"Argentina", "value"=>"AR"), array("label"=>"Armenia", "value"=>"AM"), array("label"=>"Aruba", "value"=>"AW"), array("label"=>"Australia", "value"=>"AU"), array("label"=>"Austria", "value"=>"AT"), array("label"=>"Azerbaijan", "value"=>"AZ"), array("label"=>"Bahamas", "value"=>"BS"), array("label"=>"Bahrain", "value"=>"BH"), array("label"=>"Bangladesh", "value"=>"BD"), array("label"=>"Barbados", "value"=>"BB"), array("label"=>"Belarus", "value"=>"BY"), array("label"=>"Belgium", "value"=>"BE"), array("label"=>"Belize", "value"=>"BZ"), array("label"=>"Benin", "value"=>"BJ"), array("label"=>"Bermuda", "value"=>"BM"), array("label"=>"Bhutan", "value"=>"BT"), array("label"=>"Bolivia", "value"=>"BO"), array("label"=>"Bosnia And Herzegowina","value"=>"BA"), array("label"=>"Botswana", "value"=>"BW"), array("label"=>"Bouvet Island", "value"=>"BV"), array("label"=>"Brazil", "value"=>"BR"), array("label"=>"British Indian Ocean Territory", "value"=>"IO"), array("label"=>"Brunei Darussalam", "value"=>"BN"), array("label"=>"Bulgaria", "value"=>"BG"), array("label"=>"Burkina Faso", "value"=>"BF"), array("label"=>"Burundi", "value"=>"BI"), array("label"=>"Cambodia", "value"=>"KH"), array("label"=>"Cameroon", "value"=>"CM"), array("label"=>"Canada", "value"=>"CA"), array("label"=>"Cape Verde", "value"=>"CV"), array("label"=>"Cayman Islands", "value"=>"KY"), array("label"=>"Central African Republic", "value"=>"CF"), array("label"=>"Chad", "value"=>"TD"), array("label"=>"Chile", "value"=>"CL"), array("label"=>"China", "value"=>"CN"), array("label"=>"Christmas Island", "value"=>"CX"), array("label"=>"Cocos (Keeling) Islands", "value"=>"CC"), array("label"=>"Colombia", "value"=>"CO"), array("label"=>"Comoros", "value"=>"KM"), array("label"=>"Congo", "value"=>"CG"), array("label"=>"Congo, Democratic People's Republic", "value"=>"CD"), array("label"=>"Cook Islands", "value"=>"CK"), array("label"=>"Costa Rica", "value"=>"CR"), array("label"=>"Cote d'Ivoire", "value"=>"CI"), array("label"=>"Croatia (local name: Hrvatska)", "value"=>"HR"), array("label"=>"Cuba", "value"=>"CU"), array("label"=>"Cyprus", "value"=>"CY"), array("label"=>"Czech Republic","value"=>"CZ"), array("label"=>"Denmark", "value"=>"DK"), array("label"=>"Djibouti", "value"=>"DJ"), array("label"=>"Dominica", "value"=>"DM"), array("label"=>"Dominican Republic", "value"=>"DO"), array("label"=>"East Timor", "value"=>"TP"), array("label"=>"Ecuador", "value"=>"EC"), array("label"=>"Egypt", "value"=>"EG"), array("label"=>"El Salvador", "value"=>"SV"), array("label"=>"Equatorial Guinea", "value"=>"GQ"), array("label"=>"Eritrea", "value"=>"ER"), array("label"=>"Estonia", "value"=>"EE"), array("label"=>"Ethiopia", "value"=>"ET"), array("label"=>"Falkland Islands (Malvinas)", "value"=>"FK"), array("label"=>"Faroe Islands", "value"=>"FO"), array("label"=>"Fiji", "value"=>"FJ"), array("label"=>"Finland", "value"=>"FI"), array("label"=>"France", "value"=>"FR"), array("label"=>"French Guiana", "value"=>"GF"), array("label"=>"French Polynesia", "value"=>"PF"), array("label"=>"French Southern Territories", "value"=>"TF"), array("label"=>"Gabon", "value"=>"GA"), array("label"=>"Gambia", "value"=>"GM"), array("label"=>"Georgia", "value"=>"GE"), array("label"=>"Germany", "value"=>"DE"), array("label"=>"Ghana", "value"=>"GH"), array("label"=>"Gibraltar", "value"=>"GI"), array("label"=>"Greece", "value"=>"GR"), array("label"=>"Greenland", "value"=>"GL"), array("label"=>"Grenada", "value"=>"GD"), array("label"=>"Guadeloupe", "value"=>"GP"), array("label"=>"Guam", "value"=>"GU"), array("label"=>"Guatemala", "value"=>"GT"), array("label"=>"Guernsey", "value"=>"GG"), array("label"=>"Guinea", "value"=>"GN"), array("label"=>"Guinea-Bissau", "value"=>"GW"), array("label"=>"Guyana", "value"=>"GY"), array("label"=>"Haiti", "value"=>"HT"), array("label"=>"Heard And Mc Donald Islands", "value"=>"HM"), array("label"=>"Honduras", "value"=>"HN"), array("label"=>"Hong Kong", "value"=>"HK"), array("label"=>"Hungary", "value"=>"HU"), array("label"=>"Iceland", "value"=>"IS"), array("label"=>"India", "value"=>"IN"), array("label"=>"Indonesia", "value"=>"ID"), array("label"=>"Iran (Islamic Republic Of)", "value"=>"IR"), array("label"=>"Iraq", "value"=>"IQ"), array("label"=>"Ireland", "value"=>"IE"), array("label"=>"Isle of Man", "value"=>"IM"), array("label"=>"Israel", "value"=>"IL"), array("label"=>"Italy", "value"=>"IT"), array("label"=>"Jamaica", "value"=>"JM"), array("label"=>"Japan", "value"=>"JP"), array("label"=>"Jersey", "value"=>"JE"), array("label"=>"Jordan", "value"=>"JO"), array("label"=>"Kazakhstan", "value"=>"KZ"), array("label"=>"Kenya", "value"=>"KE"), array("label"=>"Kiribati", "value"=>"KI"), array("label"=>"Korea, Democratic People's Republic Of", "value"=>"KP"), array("label"=>"Korea, Republic Of", "value"=>"KR"), array("label"=>"Kuwait", "value"=>"KW"), array("label"=>"Kyrgyzstan", "value"=>"KG"), array("label"=>"Lao People's Democratic Republic", "value"=>"LA"), array("label"=>"Latvia", "value"=>"LV"), array("label"=>"Lebanon", "value"=>"LB"), array("label"=>"Lesotho", "value"=>"LS"), array("label"=>"Liberia", "value"=>"LR"), array("label"=>"Libyan Arab Jamahiriya", "value"=>"LY"), array("label"=>"Liechtenstein", "value"=>"LI"), array("label"=>"Lithuania", "value"=>"LT"), array("label"=>"Luxembourg", "value"=>"LU"), array("label"=>"Macau", "value"=>"MO"), array("label"=>"Macedonia, The Former Yugoslav", "value"=>"MK"), array("label"=>"Of", "value"=>"Republic"), array("label"=>"Madagascar", "value"=>"MG"), array("label"=>"Malawi", "value"=>"MW"), array("label"=>"Malaysia", "value"=>"MY"), array("label"=>"Maldives", "value"=>"MV"), array("label"=>"Mali", "value"=>"ML"), array("label"=>"Malta", "value"=>"MT"), array("label"=>"Marshall Islands", "value"=>"MH"), array("label"=>"Martinique", "value"=>"MQ"), array("label"=>"Mauritania", "value"=>"MR"), array("label"=>"Mauritius", "value"=>"MU"), array("label"=>"Mayotte", "value"=>"YT"), array("label"=>"Mexico", "value"=>"MX"), array("label"=>"Micronesia, Federated States Of", "value"=>"FM"), array("label"=>"Moldova, Republic Of", "value"=>"MD"), array("label"=>"Monaco", "value"=>"MC"), array("label"=>"Mongolia", "value"=>"MN"), array("label"=>"Montserrat", "value"=>"MS"), array("label"=>"Morocco", "value"=>"MA"), array("label"=>"Mozambique", "value"=>"MZ"), array("label"=>"Myanmar", "value"=>"MM"), array("label"=>"Namibia", "value"=>"NA"), array("label"=>"Nauru", "value"=>"NR"), array("label"=>"Nepal", "value"=>"NP"), array("label"=>"Netherlands", "value"=>"NL"), array("label"=>"Netherlands Antilles", "value"=>"AN"), array("label"=>"New Caledonia", "value"=>"NC"), array("label"=>"New Zealand", "value"=>"NZ"), array("label"=>"Nicaragua", "value"=>"NI"), array("label"=>"Niger", "value"=>"NE"), array("label"=>"Nigeria", "value"=>"NG"), array("label"=>"Niue", "value"=>"NU"), array("label"=>"Norfolk Island", "value"=>"NF"), array("label"=>"Northern Mariana Islands", "value"=>"MP"), array("label"=>"Norway", "value"=>"NO"), array("label"=>"Oman", "value"=>"OM"), array("label"=>"Pakistan", "value"=>"PK"), array("label"=>"Palau", "value"=>"PW"), array("label"=>"Palestinian Territories", "value"=>"PS"), array("label"=>"Panama", "value"=>"PA"), array("label"=>"Papua New Guinea", "value"=>"PG"), array("label"=>"Paraguay", "value"=>"PY"), array("label"=>"Peru", "value"=>"PE"), array("label"=>"Philippines", "value"=>"PH"), array("label"=>"Pitcairn", "value"=>"PN"), array("label"=>"Poland", "value"=>"PL"), array("label"=>"Portugal", "value"=>"PT"), array("label"=>"Puerto Rico", "value"=>"PR"), array("label"=>"Qatar", "value"=>"QA"), array("label"=>"Reunion", "value"=>"RE"), array("label"=>"Romania", "value"=>"RO"), array("label"=>"Russian Federation", "value"=>"RU"), array("label"=>"Rwanda", "value"=>"RW"), array("label"=>"Saint Kitts And Nevis", "value"=>"KN"), array("label"=>"Saint Lucia", "value"=>"LC"), array("label"=>"Saint Vincent And The Grenadines", "value"=>"VC"), array("label"=>"Samoa", "value"=>"WS"), array("label"=>"San Marino", "value"=>"SM"), array("label"=>"Sao Tome And Principe", "value"=>"ST"), array("label"=>"Saudi Arabia", "value"=>"SA"), array("label"=>"Senegal", "value"=>"SN"), array("label"=>"Seychelles", "value"=>"SC"), array("label"=>"Sierra Leone", "value"=>"SL"), array("label"=>"Singapore", "value"=>"SG"), array("label"=>"Slovakia (Slovak Republic)", "value"=>"SK"), array("label"=>"Slovenia", "value"=>"SI"), array("label"=>"Solomon Islands", "value"=>"SB"), array("label"=>"Somalia", "value"=>"SO"), array("label"=>"South Africa", "value"=>"ZA"), array("label"=>"South Georgia And South Sandwich", "value"=>"GS"), array("label"=>"Spain", "value"=>"ES"), array("label"=>"Sri Lanka", "value"=>"LK"), array("label"=>"St. Helena", "value"=>"SH"), array("label"=>"St. Pierre And Miquelon", "value"=>"PM"), array("label"=>"Sudan", "value"=>"SD"), array("label"=>"Suriname", "value"=>"SR"), array("label"=>"Svalbard And Jan Mayen Islands", "value"=>"SJ"), array("label"=>"Swaziland", "value"=>"SZ"), array("label"=>"Sweden", "value"=>"SE"), array("label"=>"Switzerland", "value"=>"CH"), array("label"=>"Syrian Arab Republic", "value"=>"SY"), array("label"=>"Taiwan, Province Of China", "value"=>"TW"), array("label"=>"Tajikistan", "value"=>"TJ"), array("label"=>"Tanzania, United Republic Of", "value"=>"TZ"), array("label"=>"Thailand", "value"=>"TH"), array("label"=>"Togo", "value"=>"TG"), array("label"=>"Tokelau", "value"=>"TK"), array("label"=>"Tonga", "value"=>"TO"), array("label"=>"Trinidad And Tobago", "value"=>"TT"), array("label"=>"Tunisia", "value"=>"TN"), array("label"=>"Turkey", "value"=>"TR"), array("label"=>"Turkmenistan", "value"=>"TM"), array("label"=>"Turks And Caicos Islands", "value"=>"TC"), array("label"=>"Tuvalu", "value"=>"TV"), array("label"=>"Uganda", "value"=>"UG"), array("label"=>"Ukraine", "value"=>"UA"), array("label"=>"United Arab Emirates", "value"=>"AE"), array("label"=>"United Kingdom", "value"=>"UK"), array("label"=>"United States", "value"=>"US"), array("label"=>"United States Minor Outlying Islands", "value"=>"UM"), array("label"=>"Uruguay", "value"=>"UY"), array("label"=>"Uzbekistan", "value"=>"UZ"), array("label"=>"Vanuatu", "value"=>"VU"), array("label"=>"Vatican City State (Holy See)", "value"=>"VA"), array("label"=>"Venezuela", "value"=>"VE"), array("label"=>"Viet Nam", "value"=>"VN"), array("label"=>"Virgin Islands (British)", "value"=>"VG"), array("label"=>"Virgin Islands (U.S.)", "value"=>"VI"), array("label"=>"Wallis And Futuna Islands", "value"=>"WF"), array("label"=>"Western Sahara", "value"=>"EH"), array("label"=>"Yemen", "value"=>"YE"), array("label"=>"Yugoslavia", "value"=>"YU"), array("label"=>"Zaire", "value"=>"ZR"), array("label"=>"Zambia", "value"=>"ZM"), array("label"=>"Zimbabwe", "value"=>"ZW"), array("label"=>"Undefined", "value"=>"N/A") ); var $hide_html = false; function Customers($SoapEngine) { dprint("init Customers"); $this->filters = array( 'username' => trim($_REQUEST['username_filter']), 'firstName' => trim($_REQUEST['firstName_filter']), 'lastName' => trim($_REQUEST['lastName_filter']), 'organization' => trim($_REQUEST['organization_filter']), 'tel' => trim($_REQUEST['tel_filter']), 'email' => trim($_REQUEST['email_filter']), 'web' => trim($_REQUEST['web_filter']), 'country' => trim($_REQUEST['country_filter']), 'city' => trim($_REQUEST['city_filter']), 'only_resellers' => trim($_REQUEST['only_resellers_filter']) ); $this->Records($SoapEngine); $this->showAddForm = $_REQUEST['showAddForm']; if (is_array($this->SoapEngine->customer_properties)) { $this->customer_properties = $this->SoapEngine->customer_properties; } else { $this->customer_properties = array(); } $this->allProperties=array_merge($this->propertiesItems,$this->customer_properties); } function showSeachForm() { printf ("

%s", $this->SoapEngine->ports[$this->SoapEngine->port]['description'], '%' ); printf ("

",$_SERVER['PHP_SELF']); print "
"; print " "; print " "; $this->showEngineSelection(); print "
"; $this->showSortForm(); print "

Id"; $this->showCustomerSelection(); $this->showResellerSelection(); print "
"; $this->showSeachFormCustom(); $this->printHiddenFormElements('skipServiceElement'); print "
"; } function listRecords() { // Filter $filter=array('username' => $this->filters['username'], 'firstName' => $this->filters['firstName'], 'lastName' => $this->filters['lastName'], 'organization' => $this->filters['organization'], 'tel' => $this->filters['tel'], 'email' => $this->filters['email'], 'web' => $this->filters['web'], 'city' => $this->filters['city'], 'country' => $this->filters['country'], 'only_resellers' => $this->filters['only_resellers'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); //print_r($filter); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->showSeachForm(); if ($this->showAddForm) { $this->showAddForm(); return true; } // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); // Call function if ($this->adminonly && $this->filters['only_resellers']) { $this->log_action('getResellers'); $result = $this->SoapEngine->soapclient->getResellers($Query); } else { $this->log_action('getCustomers'); $result = $this->SoapEngine->soapclient->getCustomers($Query); } if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print "
$this->rows records found. Click on the id to edit the account.
"; print "
"; $_add_url = $this->url.sprintf("&service=%s&showAddForm=1", urlencode($this->SoapEngine->service) ); printf ("Add new account ",$_add_url); if ($this->adminonly) { if ($this->adminonly && $this->filters['reseller']) { $_add_url = $this->url.sprintf("&service=%s&showAddForm=1&reseller_filter=%s", urlencode($this->SoapEngine->service), urlencode($this->filters['reseller']) ); printf (" Add a new account for reseller %s",$_add_url,$this->filters['reseller']); } } print "
"; if ($this->rows > 1) { print " "; } if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } $i=0; if ($this->rows > 1) { while ($i < $maxrows) { if (!$result->accounts[$i]) break; $customer = $result->accounts[$i]; $index = $this->next+$i+1; $_url = $this->url.sprintf("&service=%s&action=Delete&reseller_filter=%s&customer_filter=%s", urlencode($this->SoapEngine->service), urlencode($customer->reseller), urlencode($customer->id) ); if ($_REQUEST['action'] == 'Delete' && $_REQUEST['customer_filter'] == $customer->id) { $_url .= "&confirm=1"; $actionText = "Confirm"; } else { $actionText = "Delete"; } $_customer_url = $this->url.sprintf("&service=%s&reseller_filter=%s&customer_filter=%s", urlencode($this->SoapEngine->service), urlencode($customer->reseller), urlencode($customer->id) ); printf(" "; $i++; } } print "
Id Impersonate Username Name Organization Country E-mail Phone number Change date Actions
%s %s.%s %s %s %s %s %s %s %s %s %s %s ", $index, $_customer_url, $customer->id, $customer->reseller, $customer->impersonate, strip_tags($customer->username), strip_tags($customer->firstName), strip_tags($customer->lastName), strip_tags($customer->organization), strip_tags($customer->country), strip_tags($customer->email), strip_tags($customer->email), $customer->tel, $customer->changeDate, $_url, $actionText ); $this->showExtraActions($customer); print "
"; if ($this->rows == 1 ) { $customer = $result->accounts[0]; $this->showRecord($customer); } $this->showPagination($maxrows); return true; } } function showSeachFormCustom() { printf ("
Username
",$this->filters['username']); printf ("
FN
\n",$this->filters['firstName']); printf ("
LN
\n",$this->filters['lastName']); printf ("
Organization
\n",$this->filters['organization']); printf ("
Email
\n",$this->filters['email']); if ($this->adminonly) { if ($this->filters['only_resellers']) $check_only_resellers_filter='checked'; printf (" Resellers ",$check_only_resellers_filter); } } function deleteRecord($dictionary= Array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if ($dictionary['customer']) { $customer=$dictionary['customer']; } else { $customer=$this->filters['customer']; } if (!strlen($customer)) { print "

Error: missing customer id. "; return false; } $function=array('commit' => array('name' => 'deleteAccount', 'parameters' => array(intval($customer)), 'logs' => array('success' => sprintf('Customer id %s has been deleted',$this->filters['customer']))) ); if ($this->SoapEngine->execute($function,$this->html)) { unset($this->filters); return true; } else { return false; } } function getRecord($id) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount(intval($id)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { return $result; } } function showRecordHeader($customer) { } function showRecordFooter($customer) { } function showExtraActions($customer) { } function showRecord($customer) { //dprint_r($customer); $this->showRecordHeader($customer); print ""; printf ("",$_SERVER['PHP_SELF']); print " "; print "
"; if ($_REQUEST['action'] != 'Delete' && $_REQUEST['action'] != 'Copy') { print ""; printf (" E-mail account information"); } print " "; printf ("",$customer->id); if ($this->adminonly) { printf ("",$customer->reseller); } if ($this->adminonly || $this->reseller == $customer->reseller) { if ($_REQUEST['action'] != 'Delete') { print "
"; } print "
"; if ($_REQUEST['action'] == 'Delete' || $_REQUEST['action'] == 'Copy') { print ""; } } print "
"; printf (""); foreach (array_keys($this->FieldsReadOnly) as $item) { printf ("", ucfirst($item), $customer->$item ); } foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name=$this->Fields[$item]['name']; } else { $item_name=ucfirst($item); } if ($item=='timezone') { printf ("", $item_name ); print " "; } else if ($item=='state') { printf ("", $item_name ); print " "; } else if ($item=='country') { printf ("", $item_name ); print " "; } else if ($item=='resellerActive' && ($customer->reseller != $customer->id)) { printf ("", $item, $customer->$item); } else if ($item=='impersonate') { if ($customer->reseller != $customer->id) { if ($this->adminonly || $this->customer == $customer->reseller) { printf ("", $item_name ); print " "; } else { printf (" ", $item_name, $item, $customer->$item, $customer->$item ); } } else { printf (" ", $item, $customer->$item ); } } else { if ($this->Fields[$item]['type'] == 'textarea') { printf (" ", $item_name, $item, $customer->$item ); } elseif ($this->Fields[$item]['type'] == 'boolean') { if ($this->Fields[$item]['adminonly'] && !$this->adminonly) { printf (" ", $item_name, $item, $customer->$item, $customer->$item ); } else { $_var='select_'.$item; ${$_var}[$customer->$item]='selected'; printf (" ", $item_name, $item, ${$_var}[0], ${$_var}[1] ); } } else { if ($this->Fields[$item]['adminonly'] && !$this->adminonly) { printf (" ", $item_name, $item, $customer->$item, $customer->$item ); } else { printf (" ", $item_name, $item, $customer->$item, $this->Fields[$item]['extra_html'] ); } } } } $this->printFiltersToForm(); $this->printHiddenFormElements(); //print ""; print "
Property Value
%s %s
%s"; $this->showTimezones($customer->$item); print "
%s
%s
%s "; $this->getChildren($customer->reseller); if (count($this->children)> 0) { print " "; } else { printf (" ", $item, $customer->$item ); } print "
%s %s
%s
%s %s
%s
%s %s
%s
"; /* print "
";
         print_r($customer);
         print "
"; */ print "
"; /* print "
";
         print_r($this->login_credentials);
         print "
"; */ print " "; if ($this->login_credentials['login_type'] == 'admin') { printf (""); } else if ($this->login_credentials['login_type'] == 'reseller') { printf ("" ); } else { printf ("" ); } foreach ($customer->properties as $_property) { if (in_array($_property->name,array_keys($this->allProperties))) { $this->allProperties[$_property->name]['value']=$_property->value; } } foreach (array_keys($this->allProperties) as $item) { $item_print=preg_replace("/_/"," ",$item); $_permission=$this->allProperties[$item]['permission']; if ($this->login_credentials['login_type'] == 'admin') { if ($this->allProperties[$item]['permission'] == 'admin' && $customer->id != $customer->reseller && $this->allProperties[$item]['resellerMayManageForChildAccounts']) { $_permission='reseller'; } printf ("", $this->allProperties[$item]['category'], ucfirst($_permission), $item_print, $item, $this->allProperties[$item]['value'], $this->allProperties[$item]['name'] ); } else if ($this->login_credentials['login_type'] == 'reseller') { // logged in as reseller if ($this->allProperties[$item]['permission'] == 'admin') { if ($customer->id == $customer->reseller ) { // reseller cannot modify himself for items with admin permission if (!$this->allProperties[$item]['invisible']) { printf ("", ucfirst($this->allProperties[$item]['permission']), $this->allProperties[$item]['name'], $this->allProperties[$item]['value'] ); } } else { if ($this->allProperties[$item]['resellerMayManageForChildAccounts']) { // reseller can manage these properties for his customers printf ("", 'Reseller', $this->allProperties[$item]['name'], $item, $this->allProperties[$item]['value'] ); } else { if (!$this->allProperties[$item]['invisible']) { // otherwise cannot modify them printf ("", ucfirst($this->allProperties[$item]['permission']), $this->allProperties[$item]['name'], $this->allProperties[$item]['value'] ); } } } } else { printf ("", ucfirst($this->allProperties[$item]['permission']), $this->allProperties[$item]['name'], $item, $this->allProperties[$item]['value'] ); } } else { // logged in as customer if ($this->allProperties[$item]['permission'] == 'admin' || $this->allProperties[$item]['permission'] == 'reseller' ) { if (!$this->allProperties[$item]['invisible']) { printf ("", $this->allProperties[$item]['name'], $this->allProperties[$item]['value'] ); } } else { printf ("", $this->allProperties[$item]['name'], $item, $this->allProperties[$item]['value'] ); } } } print "
Category Level Property Value Description
Level Property Value
Property Value
%s %s %s %s
%s %s %s
%s %s
%s %s %s
%s %s
%s %s
%s
"; $this->printFiltersToForm(); $this->printHiddenFormElements(); print ""; print "
"; $this->showRecordFooter($customer); } function updateRecord () { //print "

Updating customer ..."; if (!strlen($this->filters['customer'])) { return false; } if (!$customer=$this->getRecord($this->filters['customer'])) { return false; } if ($_REQUEST['notify']) { $customer_notify=array('firstName'=> $customer->firstName, 'lastName' => $customer->lastName, 'email' => $customer->email, 'username' => $customer->username, 'password' => $customer->password ); if ($this->notify($customer_notify)) { print "

"; printf (_("The login account details have been sent to %s"), $customer->email); return true; } else { print "

"; printf (_("Error sending e-mail notification")); return false; } } if (!$this->updateBefore($customer)) { return false; } $customer->credit = floatval($customer->credit); $customer->balance = floatval($customer->balance); foreach ($customer->properties as $_property) { $properties[]=$_property; } if (is_array($properties)) { $customer->properties=$properties; } else { $customer->properties=array(); } $customer_old = $customer; // update properties foreach (array_keys($this->allProperties) as $item) { $var_name = $item.'_form'; $updated_property=array(); foreach (array_keys($customer->properties) as $_key) { $_property=$customer->properties[$_key]; if ($_property->name == $item) { // update property if ($_property->permission == 'admin') { if ($this->login_credentials['login_type'] == 'admin') { $customer->properties[$_key]->value=trim($_REQUEST[$var_name]); } else if ($this->login_credentials['login_type'] == 'reseller' && $this->allProperties[$item]['resellerMayManageForChildAccounts']) { if ($customer->id != $customer->reseller) { $customer->properties[$_key]->value=trim($_REQUEST[$var_name]); } } } else if ($_property->permission == 'reseller') { if ($this->login_credentials['login_type'] == 'admin' || $this->login_credentials['login_type'] == 'reseller') { $customer->properties[$_key]->value=trim($_REQUEST[$var_name]); } } else { $customer->properties[$_key]->value=trim($_REQUEST[$var_name]); if ($_key == 'yubikey' && $_REQUEST[$var_name] != '') { $customer->properties[$_key]->value = substr($customer->properties[$_key]->value,0,12); } } $updated_property[$item]++; break; } } if (!$updated_property[$item] && strlen($_REQUEST[$var_name])) { // add new property unset($var_value); unset($_permission); if ($this->allProperties[$item]['permission'] == 'admin') { $_permission = 'admin'; if ($this->login_credentials['login_type'] == 'admin') { $var_value = trim($_REQUEST[$var_name]); } else if ($this->login_credentials['login_type'] == 'reseller' && $this->allProperties[$item]['resellerMayManageForChildAccounts']) { if ($customer->id != $customer->reseller) { $var_value = trim($_REQUEST[$var_name]); } } } else if ($this->allProperties[$item]['permission'] == 'reseller') { $_permission = 'reseller'; if ($this->login_credentials['login_type'] == 'admin' || $this->login_credentials['login_type'] == 'reseller') { $var_value = trim($_REQUEST[$var_name]); } } else { $_permission = 'customer'; $var_value = trim($_REQUEST[$var_name]); } if (strlen($var_value)) { if ($item == 'yubikey' ) { $var_value = substr($var_value,0,12); } $customer->properties[] = array('name' => $item, 'value' => $var_value, 'category' => $this->allProperties[$item]['category'], 'permission' => $this->allProperties[$item]['permission'] ); } } } /* print "

";
         print_r($customer->properties);
         print "
"; */ foreach (array_keys($this->Fields) as $item) { $var_name=$item.'_form'; //printf ("
%s=%s",$var_name,$_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer' || $this->Fields[$item]['type'] == 'boolean') { $customer->$item = intval($_REQUEST[$var_name]); } else if ($this->Fields[$item]['type'] == 'float') { $customer->$item = floatval($_REQUEST[$var_name]); } else { $customer->$item = strip_tags(trim($_REQUEST[$var_name])); } } $customer->tel = preg_replace("/[^\+0-9]/","",$customer->tel); $customer->fax = preg_replace("/[^\+0-9]/","",$customer->fax); $customer->enum = preg_replace("/[^\+0-9]/","",$customer->enum); if (!strlen($_REQUEST['password_form'])) $customer->password = $this->RandomString(6); if (!strlen($_REQUEST['state_form'])) $customer->state = 'N/A'; if (!strlen($_REQUEST['country_form'])) $customer->country = 'N/A'; if (!strlen($_REQUEST['city_form'])) $customer->city = 'Unknown'; if (!strlen($_REQUEST['address_form'])) $customer->address = 'Unknown'; if (!strlen($_REQUEST['postcode_form'])) $customer->postcode = 'Unknown'; if (!strlen($_REQUEST['tel_form'])) $customer->tel = '+19999999999'; if ($customer->reseller != $customer->id) { // a subaccount cannot change his own impersonate field if (!$this->adminonly) { if ($this->customer != $customer->reseller) { $customer->impersonate=$customer_old->impersonate; } } } $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($customer), 'logs' => array('success' => sprintf('Customer id %s has been updated',$customer->id))) ); //dprint_r($customer); if ($this->SoapEngine->execute($function,$this->html,$this->adminonly)) { $this->updateAfter($customer,$customer_old); return true; } else { return false; } } function showTimezones($timezone) { if (!$fp = fopen("timezones", "r")) { print _("Failed to open timezone file."); return false; } print ""; } function getChildren($reseller) { return; // Filter $filter=array('reseller' => intval($reseller)); // Range $range=array('start' => 0, 'count' => 1000 ); // Order $orderBy = array('attribute' => 'firstName', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getCustomers'); // Call function $result = $this->SoapEngine->soapclient->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $i=0; if ($result->total > 100) return; while ($i < $result->total) { $customer = $result->accounts[$i]; $this->children[$customer->id]=array('firstName' => $customer->firstName, 'lastName' => $customer->lastName, 'organization' => $customer->organization ); $i++; } } } function copyRecord () { //print "

Copy customer ..."; if (!strlen($this->filters['customer'])) { return false; } if (!$_REQUEST['confirm']) { print "

Please press on Copy again to confirm the copy"; return true; } if (!$customer=$this->getRecord($this->filters['customer'])) { return false; } $customer->credit = floatval($customer->credit); $customer->balance = floatval($customer->balance); foreach ($customer->properties as $_property) { $properties[]=$_property; } if (is_array($properties)) { $customer->properties=$properties; } else { $customer->properties=array(); } // change username $customer_new=$customer; unset($customer_new->id); $j=1; while ($j < 9) { $customer_new->username=$customer->username.$j; $function=array('commit' => array('name' => 'addAccount', 'parameters' => array($customer_new), 'logs' => array('success' => sprintf('Customer id %s has been copied',$customer->id))) ); if ($this->SoapEngine->execute($function,$this->html)) { // Reset filters to find the copy $this->filters=array(); $this->filters['username']=$customer_new->username; return true; } else { if ($this->SoapEngine->error_fault->detail->exception->errorcode != "5001") { return false; } } $j++; } } function showAddForm($confirmPassword=false) { print "

Add new account

"; print "

"; print _("Accounts are used for login and to assign ownership to data created in the platform. "); printf ("

",$_SERVER['PHP_SELF']); print "

"; if ($this->adminonly && $this->filters['reseller']) { printf ("

Reseller %s
Reseller %s
%s
"; print _("ENUM number generator"); print "
"; print " "; print " "; if ($_REQUEST['add_prefix']) { $add_prefix=$_REQUEST['add_prefix']; } else { $add_prefix = $this->sipRecords->getCustomerProperty('enum_generator_add_prefix'); } print " ",$add_prefix); if ($_REQUEST['number_length']) { $number_length=$_REQUEST['number_length']; } else { $number_length = $this->sipRecords->getCustomerProperty('enum_generator_number_length'); } print " "; if ($_REQUEST['strip_digits']) { $strip_digits=$_REQUEST['strip_digits']; } else if ($strip_digits = $this->sipRecords->getCustomerProperty('enum_generator_strip_digits')) { } else { $strip_digits=0; } print " ",$strip_digits); print " "; print " "; if (count($this->sipRecords->allowedDomains) > 0) { print " "; print " "; print " ",$checked_create_sip); if ($_REQUEST['pstn']) { $checked_pstn='checked'; } else { $checked_pstn=''; } print " ",$checked_pstn); if ($_REQUEST['prepaid']) { $checked_prepaid='checked'; } else { $checked_prepaid=''; } print " ",$checked_prepaid); if ($_REQUEST['rpid_strip_digits']) { $rpid_strip_digits=$_REQUEST['rpid_strip_digits']; } else if ($rpid_strip_digits = $this->sipRecords->getCustomerProperty('enum_generator_rpid_strip_digits')) { } else { $rpid_strip_digits=0; } print " ",$rpid_strip_digits); print " ",$_REQUEST['quota']); print " ",$_REQUEST['password']); if (isset($_REQUEST['call_limit'])) { $call_limit=$_REQUEST['call_limit']; } else { $call_limit = $this->sipRecords->getCustomerProperty('enum_generator_call_limit'); } if (!strlen($call_limit) && strlen($this->default_call_limit)) { $call_limit = $this->default_call_limit; } print " ",$call_limit); if (isset($_REQUEST['ip_access_list'])) { $ip_access_list=$_REQUEST['ip_access_list']; } else { $ip_access_list = $this->sipRecords->getCustomerProperty('enum_generator_ip_access_list'); } if (!$ip_access_list && $this->default_ip_access_list) { $ip_access_list = $this->default_ip_access_list; } print " ",$ip_access_list); } if ($_REQUEST['nr_records']) { $nr_records=$_REQUEST['nr_records']; } else { $nr_records=1; } print " "; print " "; print " "; $this->printHiddenFormElements(); print "
"; print _("ENUM range"); print " "; /* if ($_REQUEST['range']) { $selected_range[$_REQUEST['range']]='selected'; } else if ($_last_range=$this->enumRecords->getCustomerProperty('enum_generator_range')) { $selected_range[$_last_range] = 'selected'; } if (is_array($this->enumRecords->ranges)) { print ""; } */ list($_range['prefix'],$_range['tld'])=explode("@",$_REQUEST['range']); printf ("+%s under %s",$_REQUEST['range'],$_range['prefix'],$_range['tld']); print "
"; print ""; print _("ENUM mapping template"); print ""; print "
"; print _("Add prefix after range:"); printf ("
"; print _("Number length:"); printf ("
",$number_length); print _("SIP domain:"); print " "; if (count($this->sipRecords->allowedDomains) > 0) { if ($_REQUEST['domain']) { $selected_domain[$_REQUEST['domain']]='selected'; } else if ($_last_domain=$this->sipRecords->getCustomerProperty('enum_generator_sip_domain')) { $selected_domain[$_last_domain] = 'selected'; } print " "; } else { print ""; } print " "; print "
"; print _("Strip digits:"); printf ("
"; print _("Owner:"); printf (" ",$_REQUEST['owner']); print "
"; print _("Info:"); printf (" ",$_REQUEST['info']); print "

"; print ""; print _("SIP account template"); print ""; print "
"; print _("Create SIP records"); if ($_REQUEST['create_sip']) { $checked_create_sip='checked'; } else { $checked_create_sip=''; } printf ("
"; print _("PSTN access"); printf ("
"; print _("Prepaid"); printf ("
"; print _("Strip digits from Caller-ID"); printf ("
"; print _("Quota"); printf ("
"; print _("Password"); printf ("
"; print _("PSTN call limit"); printf ("
"; print _("IP access list"); printf ("

"; print ""; print ""; printf (" Number of records: ",$nr_records); print ""; print "

"; print _("Existing records will not be overwritten. "); print "

"; } function checkGenerateRequest() { // check number of records $this->template['create_sip']=trim($_REQUEST['create_sip']); $ip_access_list = preg_replace("/\s+/"," ", $_REQUEST['ip_access_list']); if (strlen($ip_access_list) and !check_ip_access_list(trim($ip_access_list), true)) { printf ("Error: IP access lists must be a space separated list of IP network/mask, example: 10.0.20.40/24"); return false; } $this->template['ip_access_list'] = trim($ip_access_list); if (strlen($_REQUEST['call_limit']) && !is_numeric($_REQUEST['call_limit'])) { printf ("Error: PSTN call limit must be numeric"); return false; } $this->template['call_limit']=$_REQUEST['call_limit']; $this->template['rpid_strip_digits']=intval($_REQUEST['rpid_strip_digits']); $this->template['info']=trim($_REQUEST['info']); $nr_records=trim($_REQUEST['nr_records']); if (!is_numeric($nr_records) || $nr_records < 1 || $nr_records > $this->maxRecords) { printf ("Error: number of records must be a number between 1 and %d",$this->maxRecords); return false; } $this->template['nr_records'] = $nr_records; $number_length=trim($_REQUEST['number_length']); if (!is_numeric($number_length) || $number_length < $this->minimum_number_length || $number_length > $this->maximum_number_length) { printf ("Error: number length must be a number between 4 and 15",$this->minimum_number_length,$this->maximum_number_length); return false; } $this->template['number_length'] = $number_length; $strip_digits=trim($_REQUEST['strip_digits']); if (!is_numeric($strip_digits) || $strip_digits < 0 || $number_length < $strip_digits + 3) { printf ("Error: strip digits + 3 must be smaller then %d",$number_length); return false; } $this->template['strip_digits'] = $strip_digits; // sip domain $domain=trim($_REQUEST['domain']); if (!strlen($domain)) { print "Error: SIP domain is missing"; return false; } $this->template['domain'] = $domain; $add_prefix=trim($_REQUEST['add_prefix']); if (strlen($add_prefix) && !is_numeric($add_prefix)) { print "Error: Add prefix must be numeric"; return false; } $this->template['add_prefix'] = $add_prefix; $owner=trim($_REQUEST['owner']); if (strlen($owner) && !is_numeric($owner)) { print "Error: Owner must be an integer"; return false; } // check ENUM TLD list($rangePrefix,$tld)=explode('@',trim($_REQUEST['range'])); $this->template['range'] = trim($_REQUEST['range']); $this->template['rangePrefix'] = $rangePrefix; $this->template['tld'] = $tld; $this->template['quota'] = intval($_REQUEST['quota']); $this->template['owner'] = intval($owner); $this->template['pstn'] = intval($_REQUEST['pstn']); $this->template['prepaid'] = intval($_REQUEST['prepaid']); $this->template['password'] = trim($_REQUEST['password']); /////////////////////////////////////// // logical checks if (strlen($this->template['add_prefix'])) { $start = $this->template['add_prefix']; } else { $start = 0; } $this->template['digitsAfterRange'] = $this->template['number_length'] - strlen($this->template['rangePrefix']); if ($this->template['number_length'] == strlen($this->template['rangePrefix']) + strlen($this->template['add_prefix'])) { $this->template['firstNumber'] = $this->template['rangePrefix'].$this->template['add_prefix']; $this->template['lastNumber'] = substr($this->template['firstNumber'],0,-1).'9'; $this->template['maxNumbers'] = $this->template['lastNumber'] - $this->template['firstNumber'] + 1; } else { $this->template['firstNumber'] = $this->template['rangePrefix'].str_pad($start,$this->template['digitsAfterRange'],'0'); $this->template['lastNumber'] = sprintf("%.0f", $this->template['firstNumber'] + pow(10,$this->template['digitsAfterRange']-strlen($this->template['add_prefix'])) - 1); $this->template['maxNumbers'] = pow(10,$this->template['digitsAfterRange']-strlen($this->template['add_prefix'])); } dprint_r($this->template); if ($this->template['maxNumbers'] < $this->template['nr_records']) { printf ("Error: Insufficient numbers in range, requested = %d, available = %d",$this->template['nr_records'],$this->template['maxNumbers']); return false; } return true; } function generateRecords() { print "

"; if (!$this->checkGenerateRequest()) { return false; } print "

Generating records

    "; $_p=array( array('name' => 'enum_generator_sip_domain', 'category' => 'web', 'value' => strval($this->template['domain']), 'permission' => 'customer' ), array('name' => 'enum_generator_range', 'category' => 'web', 'value' => strval($this->template['range']), 'permission' => 'customer' ), array('name' => 'enum_generator_strip_digits', 'category' => 'web', 'value' => strval($this->template['strip_digits']), 'permission' => 'customer' ), array('name' => 'enum_generator_number_length', 'category' => 'web', 'value' => strval($this->template['number_length']), 'permission' => 'customer' ), array('name' => 'enum_generator_add_prefix', 'category' => 'web', 'value' => strval($this->template['add_prefix']), 'permission' => 'customer' ), array('name' => 'enum_generator_rpid_strip_digits', 'category' => 'web', 'value' => strval($this->template['rpid_strip_digits']), 'permission' => 'customer' ), array('name' => 'enum_generator_call_limit', 'category' => 'web', 'value' => strval($this->template['call_limit']), 'permission' => 'customer' ), array('name' => 'enum_generator_ip_access_list', 'category' => 'web', 'value' => strval($this->template['ip_access_list']), 'permission' => 'customer' ) ); $this->enumRecords->setCustomerProperties($_p); if ($this->template['owner']) { if ($customer = $this->customerRecords->getRecord($this->template['owner'])) { $this->template['email'] = $customer->email; $this->template['firstName'] = $customer->firstName; $this->template['lastName'] = $customer->lastName; if (!strlen($this->template['info'])) { $this->template['info'] = $customer->firstName.' '.$customer->lastName; } } else { printf ("Error: cannot retrieve customer information for owner %d",$this->template['owner']); } } dprint_r($this->template); $i=0; while ($i < $this->template['nr_records']) { $number = sprintf("%.0f", $this->template['firstNumber'] + $i); $username = substr($number,$this->template['strip_digits']); $mapto = 'sip:'.$username.'@'.$this->template['domain']; print "
  1. "; printf ('Generating number +%s with mapping %s ',$number,$mapto); flush(); $enumMapping = array('tld' => $this->template['tld'], 'number' => $number, 'type' => 'sip', 'mapto' => $mapto, 'info' => $this->template['info'], 'owner' => $this->template['owner'] ); if ($this->template['create_sip']) { if (preg_match("/^0/",$username)) { printf ('SIP accounts starting with 0 are not generated (%s@%s)',$username,$this->template['domain']); continue; } $groups=array(); printf ('and sip account %s@%s ',$username,$this->template['domain']); $ip_access_list = check_ip_access_list($this->template['ip_access_list']); $sipAccount = array('account' => $username.'@'.$this->template['domain'], 'quota' => $this->template['quota'], 'prepaid' => $this->template['prepaid'], 'password' => $this->template['password'], 'groups' => $groups, 'owner' => $this->template['owner'], 'pstn' => $this->template['pstn'], 'ip_access_list' => $ip_access_list, 'call_limit' => $this->template['call_limit'] ); if ($this->template['firstName']) { $sipAccount['fullname'] = $this->template['firstName'].' '.$this->template['lastName']; } if ($this->template['email']) { $sipAccount['email'] = $this->template['email']; } if ($this->template['pstn']) { $strip_rpid=intval($this->template['rpid_strip_digits']); if ($strip_rpid && strlen($number) > $strip_rpid) { $sipAccount['rpid']=substr($number,intval($this->template['rpid_strip_digits'])); } else { $sipAccount['rpid']=$number; } } } else { unset($sipAccount); } dprint_r($sipAccount); if (is_array($enumMapping)) $this->enumRecords->addRecord($enumMapping); if (is_array($sipAccount)) $this->sipRecords->addRecord($sipAccount); $i++; } print "
"; return true; } function printHiddenFormElements () { printf("",$this->generatorId); if ($this->adminonly) { printf("",$this->adminonly); } if ($this->template['customer']) { printf("",$this->template['customer']); } if ($this->template['reseller']) { printf("",$this->template['reseller']); } foreach (array_keys($this->EnumSoapEngine->extraFormElements) as $element) { if (!strlen($this->EnumSoapEngine->extraFormElements[$element])) continue; printf ("\n",$element,$this->EnumSoapEngine->extraFormElements[$element]); } } function getSoapEngineAllowed($soapEngines,$filter) { // filter syntax: // $filter="engine1:port1,port2,port3 engine2 engine3"; // where engine is a connection from ngnpro_engines.inc and // port is valid port from that engine like sip_accounts or enum_numbers $_filter_els=explode(" ",trim($filter)); foreach(array_keys($soapEngines) as $_engine) { foreach ($_filter_els as $_filter) { unset($_allowed_engine); $_allowed_ports=array(); list($_allowed_engine,$_allowed_ports_els) = explode(":",$_filter); if ($_allowed_ports_els) { $_allowed_ports = explode(",",$_allowed_ports_els); } if ($_engine == $_allowed_engine) { $soapEngines_checked[$_engine]=$soapEngines[$_engine]; $this->allowedPorts[$_engine]=$_allowed_ports; continue; } } } return $soapEngines_checked; } } class Actions { // this class perfom actions on an array of entities returned by selections var $actions = array(); var $version = 1; var $sub_action_parameter_size = 35; var $html = true; function Actions($SoapEngine, $login_credentials) { $this->SoapEngine = $SoapEngine; $this->login_credentials = $login_credentials; $this->version = $this->SoapEngine->version; $this->adminonly = $this->SoapEngine->adminonly; } function log_action($action='Unknown') { global $CDRTool; $location = "Unknown"; $_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR']); if ($_loc['country_name']) { $location = $_loc['country_name']; } $log = sprintf("CDRTool login username=%s, type=%s, impersonate=%s, IP=%s, location=%s, action=%s:%s, script=%s", $this->login_credentials['username'], $this->login_credentials['login_type'], $CDRTool['impersonate'], $_SERVER['REMOTE_ADDR'], $location, $this->SoapEngine->port, $action, $_SERVER['PHP_SELF'] ); syslog(LOG_NOTICE, $log); } function execute($selectionKeys, $action, $sub_action_parameter) { } function showActionsForm($filters,$sorting,$hideParameter=false) { if (!count($this->actions)) return; printf ("
",$_SERVER['PHP_SELF']); print "
"; print " "; if ($this->adminonly) { print " adminonly> "; } print ""; if (!$hideParameter) { printf (" ",$this->sub_action_parameter_size); } print "

"; print " Maximum of 500 records

"; foreach (array_keys($filters) as $_filter) { printf ("\n", $_filter,$filters[$_filter]); } foreach (array_keys($sorting) as $_sorting) { printf ("\n", $_sorting,$sorting[$_sorting]); } printf("",$this->SoapEngine->service); foreach (array_keys($this->SoapEngine->extraFormElements) as $element) { if (!strlen($this->SoapEngine->extraFormElements[$element])) continue; printf ("\n",$element,$this->SoapEngine->extraFormElements[$element]); } print "
"; } } class SipAccountsActions extends Actions { var $actions=array('block' => 'Block SIP accounts', 'deblock' => 'Deblock SIP accounts', 'enable_pstn' => 'Enable access to PSTN for the SIP accounts', 'disable_pstn' => 'Disable access to PSTN for the SIP accounts', 'deblock_quota' => 'Deblock SIP accounts blocked by quota', 'prepaid' => 'Make SIP accounts prepaid', 'postpaid' => 'Make SIP accounts postpaid', 'delete' => 'Delete SIP accounts', 'setquota' => 'Set quota of SIP account to:', 'rpidasusername' => 'Set PSTN caller ID as the username', 'prefixtorpid' => 'Add to PSTN caller ID this prefix:', 'rmdsfromrpid' => 'Remove from PSTN caller ID digits:', 'addtogroup' => 'Add SIP accounts to group:', 'removefromgroup'=> 'Remove SIP accounts from group:', 'addbalance' => 'Add to prepaid balance value:', 'changeowner' => 'Change owner to:', 'changefirstname'=> 'Change first name to:', 'changelastname' => 'Change last name to:', 'changepassword' => 'Change password to:' ); function SipAccountsActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys,$action,$sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } print "
    "; foreach($selectionKeys as $key) { flush(); //printf ("Performing action=%s on key=%s",$action,$key); $account=array('username' => $key['username'], 'domain' => $key['domain'] ); printf ("
  1. %s@%s",$key['username'],$key['domain']); if ($action=='block') { $this->log_action('addToGroup'); $function=array('commit' => array('name' => 'addToGroup', 'parameters' => array($account,'blocked'), 'logs' => array('success' => sprintf('SIP account %s@%s has been blocked',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='deblock') { $this->log_action('removeFromGroup'); $function=array('commit' => array('name' => 'removeFromGroup', 'parameters' => array($account,'blocked'), 'logs' => array('success' => sprintf('SIP account %s@%s has been de-blocked',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='removefromgroup') { if (!strlen($sub_action_parameter)) { printf ("Error: you must enter a group name"); break; } $this->log_action('removeFromGroup'); $function=array('commit' => array('name' => 'removeFromGroup', 'parameters' => array($account,$sub_action_parameter), 'logs' => array('success' => sprintf('SIP account %s@%s has been removed from group %s',$key['username'],$key['domain'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='addtogroup') { $this->log_action('addToGroup'); if (!strlen($sub_action_parameter)) { printf ("Error: you must enter a group name"); break; } $function=array('commit' => array('name' => 'addToGroup', 'parameters' => array($account,$sub_action_parameter), 'logs' => array('success' => sprintf('SIP account %s@%s is now in group %s',$key['username'],$key['domain'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='deblock_quota') { $this->log_action('removeFromGroup'); $function=array('commit' => array('name' => 'removeFromGroup', 'parameters' => array($account,'quota'), 'logs' => array('success' => sprintf('SIP account %s@%s has been deblocked from quota',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='disable_pstn') { $this->log_action('removeFromGroup'); $function=array('commit' => array('name' => 'removeFromGroup', 'parameters' => array($account,'free-pstn'), 'logs' => array('success' => sprintf('SIP account %s@%s has no access to the PSTN',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='enable_pstn') { $this->log_action('addToGroup'); $function=array('commit' => array('name' => 'addToGroup', 'parameters' => array($account,'free-pstn'), 'logs' => array('success' => sprintf('SIP account %s@%s has access to the PSTN',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='delete') { $this->log_action('deleteAccount'); $function=array('commit' => array('name' => 'deleteAccount', 'parameters' => array($account), 'logs' => array('success' => sprintf('SIP account %s@%s has been deleted',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='prepaid') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $result->prepaid=1; $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s is now prepaid',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='postpaid') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $result->prepaid=0; $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s is now postpaid',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='setquota') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->quota = intval($sub_action_parameter); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has quota set to %s',$key['username'],$key['domain'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='rmdsfromrpid') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if (is_numeric($sub_action_parameter) && strlen($result->rpid) > $sub_action_parameter) { printf("%s %s",$result->rpid,$sub_action_parameter); $result->rpid=substr($result->rpid,$sub_action_parameter); printf("%s %s",$result->rpid,$sub_action_parameter); } else { printf ("Error: '%s' must be numeric and less than caller if length",$sub_action_parameter); continue; } $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s',$key['username'],$key['domain'],$result->rpid) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='rpidasusername') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if (is_numeric($key['username'])) $result->rpid=$key['username']; $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s',$key['username'],$key['domain'],$key['username']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='prefixtorpid') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if (is_numeric($sub_action_parameter)) { $result->rpid=$sub_action_parameter.$result->rpid; } else { printf ("Error: '%s' must be numeric",$sub_action_parameter); continue; } $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s ',$key['username'],$key['domain'],$result->rpid) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='changecustomer') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if (is_numeric($sub_action_parameter)) { $result->customer=intval($sub_action_parameter); } else { printf ("Error: '%s' must be numeric",$sub_action_parameter); continue; } $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has customer set to %s ',$key['username'],$key['domain'],$result->customer) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='changeowner') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { //print_r($result); // Sanitize data types due to PHP bugs if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if (is_numeric($sub_action_parameter)) { $result->owner=intval($sub_action_parameter); } else { printf ("Error: '%s' must be numeric",$sub_action_parameter); continue; } $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s has owner set to %s ',$key['username'],$key['domain'],$result->owner) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='changefirstname') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->firstName=trim($sub_action_parameter); $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s first name has been set to %s ',$key['username'],$key['domain'],$result->firstName) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='changelastname') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->lastName=trim($sub_action_parameter); $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('SIP account %s@%s last name has been set to %s ',$key['username'],$key['domain'],$result->lastName) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='changepassword') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); $result->password=trim($sub_action_parameter); $result->quota = intval($result->quota); $result->answerTimeout = intval($result->answerTimeout); $this->log_action('updateAccount'); $function=array('commit' => array('name' => 'updateAccount', 'parameters' => array($result), 'logs' => array('success' => sprintf('Password for SIP account %s@%s has been changed',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action=='addbalance') { if (!is_numeric($sub_action_parameter)) { printf ("Error: you must enter a positive balance"); break; } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getAccount'); $result = $this->SoapEngine->soapclient->getAccount($account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } if (!$result->prepaid) { printf ("Info: SIP account %s@%s is not prepaid, no action performed",$key['username'],$key['domain']); continue; } $this->log_action('addBalance'); $function=array('commit' => array('name' => 'addBalance', 'parameters' => array($account,$sub_action_parameter), 'logs' => array('success' => sprintf('SIP account %s@%s balance has been increased with %s',$key['username'],$key['domain'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } } print "
"; } } class SipAliasesActions extends Actions { var $actions=array( 'delete' => 'Delete SIP aliases' ); function SipAliasesActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys,$action,$sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } print "
    "; foreach($selectionKeys as $key) { print "
  1. "; flush(); //printf ("Performing action=%s on key=%s",$action,$key); $alias=array('username' => $key['username'], 'domain' => $key['domain'] ); if ($action=='delete') { $this->log_action('deleteAlias'); $function=array('commit' => array('name' => 'deleteAlias', 'parameters' => array($alias), 'logs' => array('success' => sprintf('SIP alias %s@%s has been deleted',$key['username'],$key['domain']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } print "
"; } } class EnumMappingsActions extends Actions { var $actions=array( 'changettl' => 'Change TTL to:', 'changeowner' => 'Change owner to:', 'changeinfo' => 'Change info to:', 'delete' => 'Delete ENUM mappings' ); var $mapping_fields=array('id' => 'integer', 'type' => 'text', 'mapto' => 'text', 'priority' => 'integer', 'ttl' => 'integer' ); function EnumMappingsActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys,$action,$sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } print "
    "; foreach($selectionKeys as $key) { flush(); print "
  1. "; $enum_id=array('number' => $key['number'], 'tld' => $key['tld'] ); if ($action=='delete') { //printf ("Performing action=%s on key=%s",$action,$key); $function=array('commit' => array('name' => 'deleteNumber', 'parameters' => array($enum_id), 'logs' => array('success' => sprintf('ENUM number +%s under %s has been deleted',$key['number'],$key['tld']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action == 'changettl') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $number = $this->SoapEngine->soapclient->getNumber($enum_id); if ((new PEAR)->isError($number)) { $error_msg = $number->getMessage(); $error_fault= $number->getFault(); $error_code = $number->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: TTL '%s' must be numeric",$sub_action_parameter); continue; } $new_mappings=array(); foreach ($number->mappings as $_mapping) { foreach (array_keys($this->mapping_fields) as $field) { if ($field == 'ttl') { $new_mapping[$field]=intval($sub_action_parameter); } else { if ($this->mapping_fields[$field] == 'integer') { $new_mapping[$field]=intval($_mapping->$field); } else { $new_mapping[$field]=$_mapping->$field; } } } $new_mappings[]=$new_mapping; } $number->mappings=$new_mappings; $this->log_action('updateNumber'); $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($number), 'logs' => array('success' => sprintf('ENUM number %s@%s TTL has been set to %d',$key['number'],$key['tld'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeowner') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $number = $this->SoapEngine->soapclient->getNumber($enum_id); if ((new PEAR)->isError($number)) { $error_msg = $number->getMessage(); $error_fault= $number->getFault(); $error_code = $number->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $new_mappings=array(); foreach ($number->mappings as $_mapping) { $new_mappings[]=$_mapping; } $number->mappings=$new_mappings; if (is_numeric($sub_action_parameter)) { $number->owner=intval($sub_action_parameter); } else { printf ("Error: Owner '%s' must be numeric",$sub_action_parameter); continue; } $this->log_action('updateNumber'); $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($number), 'logs' => array('success' => sprintf('ENUM number %s@%s owner has been set to %d',$key['number'],$key['tld'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeinfo') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getNumber'); $number = $this->SoapEngine->soapclient->getNumber($enum_id); if ((new PEAR)->isError($number)) { $error_msg = $number->getMessage(); $error_fault= $number->getFault(); $error_code = $number->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $new_mappings=array(); foreach ($number->mappings as $_mapping) { $new_mappings[]=$_mapping; } $number->mappings=$new_mappings; $number->info=trim($sub_action_parameter); $this->log_action('updateNumber'); $function=array('commit' => array('name' => 'updateNumber', 'parameters' => array($number), 'logs' => array('success' => sprintf('ENUM number %s@%s info has been set to %s',$key['number'],$key['tld'],trim($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } } print "
"; } } class DnsRecordsActions extends Actions { var $sub_action_parameter_size = 50; var $actions = array( 'changettl' => 'Change TTL to:', 'changepriority' => 'Change Priority to:', 'changevalue' => 'Change value to:', 'delete' => 'Delete records' ); function DnsRecordsActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys, $action, $sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } print "
    "; foreach($selectionKeys as $key) { flush(); print "
  1. "; //printf ("Performing action=%s on key=%s",$action,$key['id']); if ($action=='delete') { $this->log_action('deleteRecord'); $function=array('commit' => array('name' => 'deleteRecord', 'parameters' => array(intval($key['id'])), 'logs' => array('success' => sprintf('Record %d has been deleted',$key['id']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action == 'changettl') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRecord'); $record = $this->SoapEngine->soapclient->getRecord($key['id']); if ((new PEAR)->isError($record)) { $error_msg = $record->getMessage(); $error_fault= $record->getFault(); $error_code = $record->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: TTL '%s' must be numeric",$sub_action_parameter); continue; } $record->ttl=intval($sub_action_parameter); $this->log_action('updateRecord'); $function=array('commit' => array('name' => 'updateRecord', 'parameters' => array($record), 'logs' => array('success' => sprintf('TTL for record %d has been set to %d',$key['id'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changepriority') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRecord'); $record = $this->SoapEngine->soapclient->getRecord($key['id']); if ((new PEAR)->isError($record)) { $error_msg = $record->getMessage(); $error_fault= $record->getFault(); $error_code = $record->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (is_numeric($sub_action_parameter)) { $record->priority=intval($sub_action_parameter); } else { printf ("Error: Priority '%s' must be numeric",$sub_action_parameter); continue; } $this->log_action('updateRecord'); $function=array('commit' => array('name' => 'updateRecord', 'parameters' => array($record), 'logs' => array('success' => sprintf('Priority for record %d has been set to %d',$key['id'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changevalue') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRecord'); $record = $this->SoapEngine->soapclient->getRecord($key['id']); if ((new PEAR)->isError($record)) { $error_msg = $record->getMessage(); $error_fault= $record->getFault(); $error_code = $record->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $record->value=$sub_action_parameter; $this->log_action('updateRecord'); $function=array('commit' => array('name' => 'updateRecord', 'parameters' => array($record), 'logs' => array('success' => sprintf('Value of record %d has been set to %s',$key['id'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } } } print "
"; } } class DnsZonesActions extends Actions { var $sub_action_parameter_size = 50; var $actions=array( 'changettl' => 'Change TTL to:', 'changeexpire' => 'Change Expire to:', 'changeminimum' => 'Change Minimum to:', 'changeretry' => 'Change Retry to:', 'changeinfo' => 'Change Info to:', 'addnsrecord' => 'Add name server:', 'removensrecord' => 'Remove name server:', 'delete' => 'Delete zones', 'export' => 'Export zones' ); function DnsZonesActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys,$action,$sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } if ($action!='export') { print "
    "; } else { $exported_data=array('dns_zones'=>array()); $export_customers=array(); } foreach($selectionKeys as $key) { flush(); if ($action!='export') { print "
  1. "; } //printf ("Performing action=%s on key=%s",$action,$key['name']); if ($action=='delete') { $this->log_action('deleteZone'); $function=array('commit' => array('name' => 'deleteZone', 'parameters' => array($key['name']), 'logs' => array('success' => sprintf('Zone %s has been deleted',$key['name']) ) ) ); $this->SoapEngine->execute($function,$this->html); } else if ($action=='export') { // Filter $filter=array( 'zone' => $key['name'] ); $range = array('start' => 0,'count' => 5000); // Compose query $Query=array('filter' => $filter, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $result = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { if (!in_array($result->customer, $export_customers)) { $export_customers[]=$result->customer; } if (!in_array($result->reseller, $export_customers)) { $export_customers[]=$result->reseller; } $exported_data['dns_zones'][] = objectToArray($result); } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getRecords'); // Call function $result = call_user_func_array(array($this->SoapEngine->soapclient,'getRecords'),array($Query)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $exported_data['dns_records'] = objectToArray($result->records); } } else if ($action == 'changettl') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: TTL '%s' must be numeric",$sub_action_parameter); continue; } $zone->ttl=intval($sub_action_parameter); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('TTL for zone %s has been set to %d',$key['name'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeexpire') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: Expire '%s' must be numeric",$sub_action_parameter); continue; } $zone->expire=intval($sub_action_parameter); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('Expire for zone %s has been set to %d',$key['name'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeminimum') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: Minimum '%s' must be numeric",$sub_action_parameter); continue; } $zone->minimum=intval($sub_action_parameter); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('Minimum for zone %s has been set to %d',$key['name'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'addnsrecord') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $zone->nameservers[]=$sub_action_parameter; $zone->nameservers=array_unique($zone->nameservers); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('Added NS record %s for zone %s',$sub_action_parameter,$key['name']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'removensrecord') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $new_servers=array(); foreach ($zone->nameservers as $_ns) { if ($_ns == $sub_action_parameter) continue; $new_servers[]=$_ns; } $zone->nameservers=array_unique($new_servers); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('NS record %s removed from zone %s',$sub_action_parameter,$key['name']) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeretry') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { if (!is_numeric($sub_action_parameter)) { printf ("Error: Retry '%s' must be numeric",$sub_action_parameter); continue; } $zone->retry=intval($sub_action_parameter); $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('Retry for zone %s has been set to %d',$key['name'],intval($sub_action_parameter)) ) ) ); $this->SoapEngine->execute($function,$this->html); } } else if ($action == 'changeinfo') { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZone'); $zone = $this->SoapEngine->soapclient->getZone($key['name']); if ((new PEAR)->isError($zone)) { $error_msg = $zone->getMessage(); $error_fault= $zone->getFault(); $error_code = $zone->getCode(); printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); break; } else { $zone->info=$sub_action_parameter; $this->log_action('updateZone'); $function=array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('Info for zone %s has been set to %s',$key['name'],$sub_action_parameter) ) ) ); $this->SoapEngine->execute($function,$this->html); } } } if ($action!='export') { print "
"; } else { // Filter foreach ($export_customers as $customer) { $filter=array( 'customer' => intval($customer), ); // Compose query $Query=array('filter' => $filter ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth); $this->getCustomers('getZone'); // Call function $result = $this->SoapEngine->soapclientCustomers->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } else { $exported_data['customers'] = objectToArray($result->accounts); } } print_r(json_encode($exported_data)); } } } class CustomersActions extends Actions { var $actions=array( 'delete' => 'Delete customers' ); function CustomerActions($SoapEngine, $login_credentials) { $this->Actions($SoapEngine, $login_credentials); } function execute($selectionKeys,$action,$sub_action_parameter) { if (!in_array($action,array_keys($this->actions))) { print "Error: Invalid action $action"; return false; } print "
    "; foreach($selectionKeys as $key) { flush(); print "
  1. "; if ($action=='delete') { $this->log_action('deleteAccount'); $function=array('commit' => array('name' => 'deleteAccount', 'parameters' => array(intval($key)), 'logs' => array('success' => sprintf('Customer id %s has been deleted',$key))) ); $this->SoapEngine->execute($function,$this->html); } } print "
"; } } function check_ip_access_list($acl_string, $check=false) { $list=explode(" ",$acl_string); $ip_access_list = array(); foreach ($list as $el) { $els = explode("/",$el); if (count($els) != 2) { if ($check) { return false; } else { continue; } } list($ip,$mask) = $els; if ($mask <0 or $mask > 32) { if ($check) { return false; } else { continue; } } if (!preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/",$ip)) { if ($check) { return false; } else { continue; } } $ip_access_list[]=array('ip'=>$ip, 'mask'=>intval($mask)); } if ($check) { return true; } else { return $ip_access_list; } } function objectToArray($d) { if (is_object($d)) { // Gets the properties of the given object // with get_object_vars function $d = get_object_vars($d); } if (is_array($d)) { /* * Return array converted to object * Using __FUNCTION__ (Magic constant) * for recursive call */ return array_map(__FUNCTION__, $d); } else { // Return array return $d; } } ?> diff --git a/library/ngnpro_soap_library.php b/library/ngnpro_soap_library.php index fe4950a..78275c0 100644 --- a/library/ngnpro_soap_library.php +++ b/library/ngnpro_soap_library.php @@ -1,1651 +1,1651 @@ _wsdl) list($ptype, $arrayType, $array_type_ns, $array_depth) = $this->_wsdl->getSchemaType($type, $name, $typeNamespace); if (!$arrayType) $arrayType = $artype; if (!$ptype) $ptype = $this->_getType($value); if (!$type) $type = $ptype; if (strcasecmp($ptype,'Struct') == 0 || strcasecmp($type,'Struct') == 0) { // struct $vars = NULL; if (is_object($value)) { $vars = get_object_vars($value); } else { $vars = &$value; } if (is_array($vars)) { foreach (array_keys($vars) as $k) { if ($k[0]=='_') continue; // hide private vars if (is_object($vars[$k])) { if (is_a($vars[$k],'soap_value')) { $xmlout_value .= $vars[$k]->serialize($this); } else { // XXX get the members and serialize them instead // converting to an array is more overhead than we // should realy do, but php-soap is on it's way. $xmlout_value .= $this->_serializeValue(get_object_vars($vars[$k]), $k, false, $this->_section5?NULL:$elNamespace); } } else { $xmlout_value .= $this->_serializeValue($vars[$k],$k, false, $this->_section5?NULL:$elNamespace); } } } } else if (strcasecmp($ptype,'Array')==0 || strcasecmp($type,'Array')==0) { // array $typeNamespace = SOAP_SCHEMA_ENCODING; $orig_type = $type; $type = 'Array'; $numtypes = 0; // XXX this will be slow on larger array's. Basicly, it flattens array's to allow us // to serialize multi-dimensional array's. We only do this if arrayType is set, // which will typicaly only happen if we are using WSDL if (isset($options['flatten']) || ($arrayType && (strchr($arrayType,',') || strstr($arrayType,'][')))) { $numtypes = $this->_multiArrayType($value, $arrayType, $ar_size, $xmlout_value); } $array_type = $array_type_prefix = ''; if ($numtypes != 1) { $arrayTypeQName =new QName($arrayType); $arrayType = $arrayTypeQName->name; $array_types = array(); $array_val = NULL; // serialize each array element $ar_size = count($value); foreach ($value as $array_val) { if ($this->_isSoapValue($array_val)) { $array_type = $array_val->type; $array_types[$array_type] = 1; $array_type_ns = $array_val->type_namespace; $xmlout_value .= $array_val->serialize($this); } else { $array_type = $this->_getType($array_val); $array_types[$array_type] = 1; $xmlout_value .= $this->_serializeValue($array_val,'item', $array_type, $this->_section5?NULL:$elNamespace); } } $xmlout_offset = " SOAP-ENC:offset=\"[0]\""; if (!$arrayType) { $numtypes = count($array_types); if ($numtypes == 1) $arrayType = $array_type; // using anyType is more interoperable if ($array_type == 'Struct') { $array_type = ''; } else if ($array_type == 'Array') { $arrayType = 'anyType'; $array_type_prefix = 'xsd'; } else if (!$arrayType) $arrayType = $array_type; } } if (!$arrayType || $numtypes > 1) { $arrayType = 'xsd:anyType'; // should reference what schema we're using } else { if ($array_type_ns) { $array_type_prefix = $this->_getNamespacePrefix($array_type_ns); } else if (array_key_exists($arrayType, $this->_typemap[$this->_XMLSchemaVersion])) { $array_type_prefix = $this->_namespaces[$this->_XMLSchemaVersion]; } if ($array_type_prefix) $arrayType = $array_type_prefix.':'.$arrayType; } $xmlout_arrayType = " SOAP-ENC:arrayType=\"" . $arrayType; if ($array_depth != null) { for ($i = 0; $i < $array_depth; $i++) { $xmlout_arrayType .= '[]'; } } $xmlout_arrayType .= "[$ar_size]\""; } else if ($this->_isSoapValue($value)) { $xmlout_value =& $value->serialize($this); } else if ($type == 'string') { $xmlout_value = htmlspecialchars($value); } else if ($type == 'rawstring') { $xmlout_value =& $value; } else if ($type == 'boolean') { $xmlout_value = $value?'true':'false'; } else { $xmlout_value =& $value; } // add namespaces if ($elNamespace) { $elPrefix = $this->_getNamespacePrefix($elNamespace); $xmlout_name = "$elPrefix:$name"; } else { $xmlout_name = $name; } if ($typeNamespace) { $typePrefix = $this->_getNamespacePrefix($typeNamespace); $xmlout_type = "$typePrefix:$type"; } else if ($type && array_key_exists($type, $this->_typemap[$this->_XMLSchemaVersion])) { $typePrefix = $this->_namespaces[$this->_XMLSchemaVersion]; $xmlout_type = "$typePrefix:$type"; } // handle additional attributes $xml_attr = ''; if (count($attributes) > 0) { foreach ($attributes as $k => $v) { $kqn =new QName($k); $vqn =new QName($v); $xml_attr .= ' '.$kqn->fqn().'="'.$vqn->fqn().'"'; } } // store the attachement for mime encoding if (isset($options['attachment'])) $this->__attachments[] = $options['attachment']; if ($this->_section5) { if ($xmlout_type) $xmlout_type = " xsi:type=\"$xmlout_type\""; if (is_null($xmlout_value)) { $xml = "\r\n<$xmlout_name$xmlout_type$xmlns$xmlout_arrayType$xml_attr/>"; } else { $xml = "\r\n<$xmlout_name$xmlout_type$xmlns$xmlout_arrayType$xmlout_offset$xml_attr>". $xmlout_value.""; } } else { if (is_null($xmlout_value)) { $xml = "\r\n<$xmlout_name$xmlns$xml_attr/>"; } else { $xml = "\r\n<$xmlout_name$xmlns$xml_attr>". $xmlout_value.""; } } return $xml; } function addHeader($soap_value) { // add a new header to the SOAP message if not already exists if (is_array($soap_value) && is_array($this->headersOut)) { foreach ($this->headersOut as $_header) { if ($_header->name == $soap_value[0]) { return true; } } } if (is_a($soap_value,'soap_header')) { $this->headersOut[] =& $soap_value; } else if (gettype($soap_value) == 'array') { // name, value, namespace, mustunderstand, actor $this->headersOut[] =new SOAP_Header($soap_value[0], NULL, $soap_value[1], $soap_value[2], $soap_value[3]);; } else { $this->_raiseSoapFault("Don't understand the header info you provided. Must be array or SOAP_Header."); } } } class WebService_NGNPro_SipPort extends SOAP_Client_Custom { function WebService_NGNPro_SipPort($path = 'https://mdns.sipthor.net/ngnpro/') { $this->SOAP_Client($path, 0); } function &addGateway($gateway) { // gateway is a ComplexType Gateway, // refer to wsdl for more info $gateway = new SOAP_Value('gateway', '{urn:AGProjects:NGNPro}Gateway', $gateway); $result = $this->call('addGateway', $v = array('gateway' => $gateway), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateGateway($gateway) { // gateway is a ComplexType Gateway, // refer to wsdl for more info $gateway = new SOAP_Value('gateway', '{urn:AGProjects:NGNPro}Gateway', $gateway); $result = $this->call('updateGateway', $v = array('gateway' => $gateway), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteGateway($id) { $result = $this->call('deleteGateway', $v = array('id' => $id), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getGateways($query) { // query is a ComplexType GatewayQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}GatewayQuery', $query); $result = $this->call('getGateways', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addGatewayRule($rule) { // rule is a ComplexType GatewayRule, // refer to wsdl for more info $rule = new SOAP_Value('rule', '{urn:AGProjects:NGNPro}GatewayRule', $rule); $result = $this->call('addGatewayRule', $v = array('rule' => $rule), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateGatewayRule($rule) { // rule is a ComplexType GatewayRule, // refer to wsdl for more info $rule = new SOAP_Value('rule', '{urn:AGProjects:NGNPro}GatewayRule', $rule); $result = $this->call('updateGatewayRule', $v = array('rule' => $rule), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteGatewayRule($id) { $result = $this->call('deleteGatewayRule', $v = array('id' => $id), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getGatewayRules($query) { // query is a ComplexType GatewayRuleQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}GatewayRuleQuery', $query); $result = $this->call('getGatewayRules', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addCarrier($carrier) { // carrier is a ComplexType Carrier, // refer to wsdl for more info $carrier = new SOAP_Value('carrier', '{urn:AGProjects:NGNPro}Carrier', $carrier); $result = $this->call('addCarrier', $v = array('carrier' => $carrier), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateCarrier($carrier) { // carrier is a ComplexType Carrier, // refer to wsdl for more info $carrier = new SOAP_Value('carrier', '{urn:AGProjects:NGNPro}Carrier', $carrier); $result = $this->call('updateCarrier', $v = array('carrier' => $carrier), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteCarrier($id) { $result = $this->call('deleteCarrier', $v = array('id' => $id), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getCarriers($query) { // query is a ComplexType CarrierQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}CarrierQuery', $query); $result = $this->call('getCarriers', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addRoutes($routes) { // routes is a ComplexType RouteArray, // refer to wsdl for more info $routes = new SOAP_Value('routes', '{urn:AGProjects:NGNPro}RouteArray', $routes); $result = $this->call('addRoutes', $v = array('routes' => $routes), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateRoutes($routes) { // routes is a ComplexType RouteArray, // refer to wsdl for more info $routes = new SOAP_Value('routes', '{urn:AGProjects:NGNPro}RouteArray', $routes); $result = $this->call('updateRoutes', $v = array('routes' => $routes), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteRoutes($routes) { // routes is a ComplexType RouteArray, // refer to wsdl for more info $routes = new SOAP_Value('routes', '{urn:AGProjects:NGNPro}RouteArray', $routes); $result = $this->call('deleteRoutes', $v = array('routes' => $routes), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getRoutes($query) { // query is a ComplexType RouteQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}RouteQuery', $query); $result = $this->call('getRoutes', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addDomain($domain) { // domain is a ComplexType SipDomain, // refer to wsdl for more info $domain = new SOAP_Value('domain', '{urn:AGProjects:NGNPro}SipDomain', $domain); $result = $this->call('addDomain', $v = array('domain' => $domain), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateDomain($domain) { // domain is a ComplexType SipDomain, // refer to wsdl for more info $domain = new SOAP_Value('domain', '{urn:AGProjects:NGNPro}SipDomain', $domain); $result = $this->call('updateDomain', $v = array('domain' => $domain), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteDomain($domain) { $result = $this->call('deleteDomain', $v = array('domain' => $domain), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getDomains($query) { // query is a ComplexType SipDomainQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}SipDomainQuery', $query); $result = $this->call('getDomains', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addTrustedPeer($peer) { // peer is a ComplexType TrustedPeer, // refer to wsdl for more info $peer = new SOAP_Value('peer', '{urn:AGProjects:NGNPro}TrustedPeer', $peer); $result = $this->call('addTrustedPeer', $v = array('peer' => $peer), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteTrustedPeer($ip) { $result = $this->call('deleteTrustedPeer', $v = array('ip' => $ip), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateTrustedPeer($peer) { $peer = new SOAP_Value('peer', '{urn:AGProjects:NGNPro}TrustedPeer', $peer); $result = $this->call('updateTrustedPeer', $v = array('peer' => $peer), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getTrustedPeers($query) { // query is a ComplexType TrustedPeerQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}TrustedPeerQuery', $query); $result = $this->call('getTrustedPeers', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addAccount($account) { // account is a ComplexType SipAccount, // refer to wsdl for more info $account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}SipAccount', $account); $result = $this->call('addAccount', $v = array('account' => $account), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateAccount($account) { // account is a ComplexType SipAccount, // refer to wsdl for more info $account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}SipAccount', $account); $result = $this->call('updateAccount', $v = array('account' => $account), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteAccount($sipId) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('deleteAccount', $v = array('sipId' => $sipId), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getAccount($sipId) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('getAccount', $v = array('sipId' => $sipId), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getAccounts($query) { // query is a ComplexType SipQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}SipQuery', $query); $result = $this->call('getAccounts', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addAlias($alias) { // alias is a ComplexType SipAlias, // refer to wsdl for more info $alias = new SOAP_Value('alias', '{urn:AGProjects:NGNPro}SipAlias', $alias); $result = $this->call('addAlias', $v = array('alias' => $alias), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateAlias($alias) { // alias is a ComplexType SipAlias, // refer to wsdl for more info $alias = new SOAP_Value('alias', '{urn:AGProjects:NGNPro}SipAlias', $alias); $result = $this->call('updateAlias', $v = array('alias' => $alias), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteAlias($id) { // id is a ComplexType SipId, // refer to wsdl for more info $id = new SOAP_Value('id', '{urn:AGProjects:NGNPro}SipId', $id); $result = $this->call('deleteAlias', $v = array('id' => $id), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getAlias($id) { // id is a ComplexType SipId, // refer to wsdl for more info $id = new SOAP_Value('id', '{urn:AGProjects:NGNPro}SipId', $id); $result = $this->call('getAlias', $v = array('id' => $id), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getAliases($query) { // query is a ComplexType AliasQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}AliasQuery', $query); $result = $this->call('getAliases', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addToGroup($sipId, $group) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('addToGroup', $v = array('sipId' => $sipId, 'group' => $group), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &removeFromGroup($sipId, $group) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('removeFromGroup', $v = array('sipId' => $sipId, 'group' => $group), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getGroups($sipId) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('getGroups', $v = array('sipId' => $sipId), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addBalance($sipId, $value, $description) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('addBalance', $v = array('sipId' => $sipId, 'value' => $value, 'description' => $description), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addBalanceFromVoucher($sipId, $card) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); // card is a ComplexType PrepaidCard, // refer to wsdl for more info $card = new SOAP_Value('card', '{urn:AGProjects:NGNPro}PrepaidCard', $card); $result = $this->call('addBalanceFromVoucher', $v = array('sipId' => $sipId, 'card' => $card), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getPrepaidStatus($sipIds) { // sipIds is a ComplexType SipIdArray, // refer to wsdl for more info $sipIds = new SOAP_Value('sipIds', '{urn:AGProjects:NGNPro}SipIdArray', $sipIds); $result = $this->call('getPrepaidStatus', $v = array('sipIds' => $sipIds), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getCreditHistory($sipId, $count) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('getCreditHistory', $v = array('sipId' => $sipId, 'count' => $count), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addPhonebookEntry($sipId, $entry) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); // entry is a ComplexType PhonebookEntry, // refer to wsdl for more info $entry = new SOAP_Value('entry', '{urn:AGProjects:NGNPro}PhonebookEntry', $entry); $result = $this->call('addPhonebookEntry', $v = array('sipId' => $sipId, 'entry' => $entry), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updatePhonebookEntry($sipId, $entry) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); // entry is a ComplexType PhonebookEntry, // refer to wsdl for more info $entry = new SOAP_Value('entry', '{urn:AGProjects:NGNPro}PhonebookEntry', $entry); $result = $this->call('updatePhonebookEntry', $v = array('sipId' => $sipId, 'entry' => $entry), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deletePhonebookEntry($sipId, $uri) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('deletePhonebookEntry', $v = array('sipId' => $sipId, 'uri' => $uri), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getPhonebookEntries($sipId, $match, $range) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); // match is a ComplexType PhonebookEntry, // refer to wsdl for more info $match = new SOAP_Value('match', '{urn:AGProjects:NGNPro}PhonebookEntry', $match); // range is a ComplexType Range, // refer to wsdl for more info $range = new SOAP_Value('range', '{urn:AGProjects:NGNPro}Range', $range); $result = $this->call('getPhonebookEntries', $v = array('sipId' => $sipId, 'match' => $match, 'range' => $range), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &setRejectMembers($sipId, $members) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); // members is a ComplexType StringArray, // refer to wsdl for more info $members = new SOAP_Value('members', '{urn:AGProjects:NGNPro}StringArray', $members); $result = $this->call('setRejectMembers', $v = array('sipId' => $sipId, 'members' => $members), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getRejectMembers($sipId) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('getRejectMembers', $v = array('sipId' => $sipId), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &setAcceptRules($sipId, $rules) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); // rules is a ComplexType AcceptRules, // refer to wsdl for more info $rules = new SOAP_Value('rules', '{urn:AGProjects:NGNPro}AcceptRules', $rules); $result = $this->call('setAcceptRules', $v = array('sipId' => $sipId, 'rules' => $rules), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getAcceptRules($sipId) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('getAcceptRules', $v = array('sipId' => $sipId), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &setBarringPrefixes($sipId, $prefixes) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); // prefixes is a ComplexType StringArray, // refer to wsdl for more info $prefixes = new SOAP_Value('prefixes', '{urn:AGProjects:NGNPro}StringArray', $prefixes); $result = $this->call('setBarringPrefixes', $v = array('sipId' => $sipId, 'prefixes' => $prefixes), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getBarringPrefixes($sipId) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('getBarringPrefixes', $v = array('sipId' => $sipId), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &setCallDiversions($sipId, $diversions) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); // diversions is a ComplexType CallDiversions, // refer to wsdl for more info $diversions = new SOAP_Value('diversions', '{urn:AGProjects:NGNPro}CallDiversions', $diversions); $result = $this->call('setCallDiversions', $v = array('sipId' => $sipId, 'diversions' => $diversions), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getCallDiversions($sipId) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('getCallDiversions', $v = array('sipId' => $sipId), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getCalls($sipId, $query) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); // query is a ComplexType CallsQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}CallsQuery', $query); $result = $this->call('getCalls', $v = array('sipId' => $sipId, 'query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getCallStatistics($sipId, $query) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); // query is a ComplexType CallsQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}CallsQuery', $query); $result = $this->call('getCallStatistics', $v = array('sipId' => $sipId, 'query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getSipDeviceLocations($sipIds) { // sipIds is a ComplexType SipIdArray, // refer to wsdl for more info $sipIds = new SOAP_Value('sipIds', '{urn:AGProjects:NGNPro}SipIdArray', $sipIds); $result = $this->call('getSipDeviceLocations', $v = array('sipIds' => $sipIds), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getSipTrace($filter) { // filter is a ComplexType SipTraceFilter, // refer to wsdl for more info $filter = new SOAP_Value('filter', '{urn:AGProjects:NGNPro}SipTraceFilter', $filter); $result = $this->call('getSipTrace', $v = array('filter' => $filter), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getMediaTrace($filter) { // filter is a ComplexType MediaTraceFilter, // refer to wsdl for more info $filter = new SOAP_Value('filter', '{urn:AGProjects:NGNPro}MediaTraceFilter', $filter); $result = $this->call('getMediaTrace', $v = array('filter' => $filter), array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getMediaSummary() { $result = $this->call('getMediaSummary', $v = null, array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getMediaSessions() { $result = $this->call('getMediaSessions', $v = null, array('namespace' => 'urn:AGProjects:NGNPro:Sip', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } } class WebService_NGNPro_VoicemailPort extends SOAP_Client_Custom { function WebService_NGNPro_VoicemailPort($path = 'https://mdns.sipthor.net/ngnpro/voicemail/') { $this->SOAP_Client($path, 0); } function &addAccount($account) { // account is a ComplexType VoicemailAccount, // refer to wsdl for more info $account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}VoicemailAccount', $account); $result = $this->call('addAccount', $v = array('account' => $account), array('namespace' => 'urn:AGProjects:NGNPro:Voicemail', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateAccount($account) { // account is a ComplexType VoicemailAccount, // refer to wsdl for more info $account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}VoicemailAccount', $account); $result = $this->call('updateAccount', $v = array('account' => $account), array('namespace' => 'urn:AGProjects:NGNPro:Voicemail', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteAccount($sipId) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('deleteAccount', $v = array('sipId' => $sipId), array('namespace' => 'urn:AGProjects:NGNPro:Voicemail', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getAccount($sipId) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('getAccount', $v = array('sipId' => $sipId), array('namespace' => 'urn:AGProjects:NGNPro:Voicemail', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &setAnnouncement($sipId, $message) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId); $result = $this->call('setAnnouncement', $v = array('sipId' => $sipId, 'message' => $message), array('namespace' => 'urn:AGProjects:NGNPro:Voicemail', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } } class WebService_NGNPro_EnumPort extends SOAP_Client_Custom { function WebService_NGNPro_EnumPort($path = 'https://mdns.sipthor.net/ngnpro/') { $this->SOAP_Client($path, 0); } function &addRange($range) { // range is a ComplexType EnumRange, // refer to wsdl for more info $range = new SOAP_Value('range', '{urn:AGProjects:NGNPro}EnumRange', $range); $result = $this->call('addRange', $v = array('range' => $range), array('namespace' => 'urn:AGProjects:NGNPro:Enum', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateRange($range) { // range is a ComplexType EnumRange, // refer to wsdl for more info $range = new SOAP_Value('range', '{urn:AGProjects:NGNPro}EnumRange', $range); $result = $this->call('updateRange', $v = array('range' => $range), array('namespace' => 'urn:AGProjects:NGNPro:Enum', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteRange($range) { // range is a ComplexType EnumRangeId, // refer to wsdl for more info $range = new SOAP_Value('range', '{urn:AGProjects:NGNPro}EnumRangeId', $range); $result = $this->call('deleteRange', $v = array('range' => $range), array('namespace' => 'urn:AGProjects:NGNPro:Enum', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getRanges($query) { // query is a ComplexType EnumRangeQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}EnumRangeQuery', $query); $result = $this->call('getRanges', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Enum', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addNumber($number) { // number is a ComplexType EnumNumber, // refer to wsdl for more info $number = new SOAP_Value('number', '{urn:AGProjects:NGNPro}EnumNumber', $number); $result = $this->call('addNumber', $v = array('number' => $number), array('namespace' => 'urn:AGProjects:NGNPro:Enum', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateNumber($number) { // number is a ComplexType EnumNumber, // refer to wsdl for more info $number = new SOAP_Value('number', '{urn:AGProjects:NGNPro}EnumNumber', $number); $result = $this->call('updateNumber', $v = array('number' => $number), array('namespace' => 'urn:AGProjects:NGNPro:Enum', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteNumber($enumId) { // enumId is a ComplexType EnumId, // refer to wsdl for more info $enumId = new SOAP_Value('enumId', '{urn:AGProjects:NGNPro}EnumId', $enumId); $result = $this->call('deleteNumber', $v = array('enumId' => $enumId), array('namespace' => 'urn:AGProjects:NGNPro:Enum', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getNumber($enumId) { // enumId is a ComplexType EnumId, // refer to wsdl for more info $enumId = new SOAP_Value('enumId', '{urn:AGProjects:NGNPro}EnumId', $enumId); $result = $this->call('getNumber', $v = array('enumId' => $enumId), array('namespace' => 'urn:AGProjects:NGNPro:Enum', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getNumbers($query) { // query is a ComplexType EnumNumberQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}EnumNumberQuery', $query); $result = $this->call('getNumbers', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Enum', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } } class WebService_NGNPro_DnsPort extends SOAP_Client_Custom { function WebService_NGNPro_DnsPort($path = 'https://mdns.sipthor.net/ngnpro/') { $this->SOAP_Client($path, 0); } function &addZone($zone) { // zone is a ComplexType DnsZone, // refer to wsdl for more info $zone = new SOAP_Value('zone', '{urn:AGProjects:NGNPro}DnsZone', $zone); $result = $this->call('addZone', $v = array('zone' => $zone), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateZone($zone) { // zone is a ComplexType DnsZone, // refer to wsdl for more info $zone = new SOAP_Value('zone', '{urn:AGProjects:NGNPro}DnsZone', $zone); $result = $this->call('updateZone', $v = array('zone' => $zone), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteZone($zone) { $result = $this->call('deleteZone', $v = array('zone' => $zone), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getZone($zone) { $result = $this->call('getZone', $v = array('zone' => $zone), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getZones($query) { // query is a ComplexType DnsZoneQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}DnsZoneQuery', $query); $result = $this->call('getZones', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addRecord($record) { // record is a ComplexType DnsRecord, // refer to wsdl for more info $record = new SOAP_Value('record', '{urn:AGProjects:NGNPro}DnsRecord', $record); $result = $this->call('addRecord', $v = array('record' => $record), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &addFancyRecord($record) { // record is a ComplexType DnsFancyRecord, // refer to wsdl for more info $record = new SOAP_Value('record', '{urn:AGProjects:NGNPro}DnsFancyRecord', $record); $result = $this->call('addFancyRecord', $v = array('record' => $record), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateRecord($record) { // record is a ComplexType DnsRecord, // refer to wsdl for more info $record = new SOAP_Value('record', '{urn:AGProjects:NGNPro}DnsRecord', $record); $result = $this->call('updateRecord', $v = array('record' => $record), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateFancyRecord($record) { // record is a ComplexType DnsFancyRecord, // refer to wsdl for more info $record = new SOAP_Value('record', '{urn:AGProjects:NGNPro}DnsFancyRecord', $record); $result = $this->call('updateFancyRecord', $v = array('record' => $record), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteRecord($recordId) { $result = $this->call('deleteRecord', $v = array('recordId' => $recordId), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteFancyRecord($recordId) { $result = $this->call('deleteFancyRecord', $v = array('recordId' => $recordId), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getRecord($recordId) { $result = $this->call('getRecord', $v = array('recordId' => $recordId), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getFancyRecord($recordId) { $result = $this->call('getFancyRecord', $v = array('recordId' => $recordId), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getRecords($query) { // query is a ComplexType DnsRecordQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}DnsRecordQuery', $query); $result = $this->call('getRecords', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getFancyRecords($query) { // query is a ComplexType DnsFancyRecordQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}DnsFancyRecordQuery', $query); $result = $this->call('getFancyRecords', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Dns', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } } class WebService_NGNPro_RatingPort extends SOAP_Client_Custom { function WebService_NGNPro_RatingPort($path = 'https://mdns.sipthor.net/ngnpro/') { $this->SOAP_Client($path, 0); } function &setEntityProfiles($profiles) { // profiles is a ComplexType RatingEntityProfiles, // refer to wsdl for more info $profiles = new SOAP_Value('profiles', '{urn:AGProjects:NGNPro}RatingEntityProfiles', $profiles); $result = $this->call('setEntityProfiles', $v = array('profiles' => $profiles), array('namespace' => 'urn:AGProjects:NGNPro:Rating', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteEntityProfiles($entity) { $result = $this->call('deleteEntityProfiles', $v = array('entity' => $entity), array('namespace' => 'urn:AGProjects:NGNPro:Rating', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getEntityProfiles($entity) { $result = $this->call('getEntityProfiles', $v = array('entity' => $entity), array('namespace' => 'urn:AGProjects:NGNPro:Rating', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } } class WebService_NGNPro_CustomerPort extends SOAP_Client_Custom { function WebService_NGNPro_CustomerPort($path = 'https://mdns.sipthor.net/ngnpro/') { $this->SOAP_Client($path, 0); } function &addAccount($account) { // account is a ComplexType CustomerAccount, // refer to wsdl for more info $account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}CustomerAccount', $account); $result = $this->call('addAccount', $v = array('account' => $account), array('namespace' => 'urn:AGProjects:NGNPro:Customer', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &updateAccount($account) { // account is a ComplexType CustomerAccount, // refer to wsdl for more info $account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}CustomerAccount', $account); $result = $this->call('updateAccount', $v = array('account' => $account), array('namespace' => 'urn:AGProjects:NGNPro:Customer', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deleteAccount($id) { $result = $this->call('deleteAccount', $v = array('id' => $id), array('namespace' => 'urn:AGProjects:NGNPro:Customer', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getAccount($id) { $result = $this->call('getAccount', $v = array('id' => $id), array('namespace' => 'urn:AGProjects:NGNPro:Customer', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getCustomers($query) { // query is a ComplexType CustomerQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}CustomerQuery', $query); $result = $this->call('getCustomers', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Customer', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getResellers($query) { // query is a ComplexType CustomerQuery, // refer to wsdl for more info $query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}CustomerQuery', $query); $result = $this->call('getResellers', $v = array('query' => $query), array('namespace' => 'urn:AGProjects:NGNPro:Customer', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &setProperties($customer, $properties) { // properties is a ComplexType CustomerPropertyArray, // refer to wsdl for more info $properties = new SOAP_Value('properties', '{urn:AGProjects:NGNPro}CustomerPropertyArray', $properties); $result = $this->call('setProperties', $v = array('customer' => $customer, 'properties' => $properties), array('namespace' => 'urn:AGProjects:NGNPro:Customer', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getProperties($customer) { $result = $this->call('getProperties', $v = array('customer' => $customer), array('namespace' => 'urn:AGProjects:NGNPro:Customer', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } } class WebService_NGNPro_NetworkPort extends SOAP_Client_Custom { function WebService_NGNPro_NetworkPort($path = 'https://mdns.sipthor.net/ngnpro/') { $this->SOAP_Client($path, 0); } function &getStatistics() { $result = $this->call('getStatistics', $v = null, array('namespace' => 'urn:AGProjects:NGNPro:Network', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getStatus() { $result = $this->call('getStatus', $v = null, array('namespace' => 'urn:AGProjects:NGNPro:Network', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } } class WebService_SoapSIMPLEProxy_PresencePort extends SOAP_Client_Custom { function WebService_SoapSIMPLEProxy_PresencePort($path) { $this->SOAP_Client($path, 0); } function &setPresenceInformation($sipId, $password, $information) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId); // information is a ComplexType PresenceInformation, // refer to wsdl for more info $information = new SOAP_Value('information', '{urn:AGProjects:SoapSIMPLEProxy}PresenceInformation', $information); $result = $this->call('setPresenceInformation', $v = array('sipId' => $sipId, 'password' => $password, 'information' => $information), array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getPresenceInformation($sipId, $password) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId); $result = $this->call('getPresenceInformation', $v = array('sipId' => $sipId, 'password' => $password), array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &deletePresenceInformation($sipId, $password) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId); $result = $this->call('deletePresenceInformation', $v = array('sipId' => $sipId, 'password' => $password), array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getWatchers($sipId, $password) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId); $result = $this->call('getWatchers', $v = array('sipId' => $sipId, 'password' => $password), array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &setPolicy($sipId, $password, $policy) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId); // policy is a ComplexType PresencePolicy, // refer to wsdl for more info $policy = new SOAP_Value('policy', '{urn:AGProjects:SoapSIMPLEProxy}PresencePolicy', $policy); $result = $this->call('setPolicy', $v = array('sipId' => $sipId, 'password' => $password, 'policy' => $policy), array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } function &getPolicy($sipId, $password) { // sipId is a ComplexType SipId, // refer to wsdl for more info $sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId); $result = $this->call('getPolicy', $v = array('sipId' => $sipId, 'password' => $password), array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence', 'soapaction' => '', 'style' => 'rpc', 'use' => 'encoded')); return $result; } } ?> diff --git a/library/provisioning_statistics.php b/library/provisioning_statistics.php index fa19bbb..22d1269 100644 --- a/library/provisioning_statistics.php +++ b/library/provisioning_statistics.php @@ -1,636 +1,636 @@ setTime(23, 59, 00); // reset time part, to prevent partial comparison if ($stop_date == $today) { $new_stop_date = $stop_date->add(new DateInterval('P1D')); } else { $new_stop_date = $stop_date; } $db = new $class(); $start = (float) array_sum(explode(' ', microtime())); $query = sprintf( "select port, sum(number) as number from ( select substring_index(function,':',1) as port, sum(total) as number from ngnpro_logs_functions where date between '%s' and '%s' group by port union all select substring_index(function,':',1) as port, sum(total) as number from ngnpro_logs_functions_history where date between '%s' and '%s' group by port ) t group by port order by number desc limit 0,5", $start_date->format('Y-m-d 00:00:00'), $new_stop_date->format('Y-m-d 00:00:00'), $start_date->format('Y-m-d 00:00:00'), $new_stop_date->format('Y-m-d 00:00:00') ); dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if (!$db->num_rows()) { return array(); } $requests['total'] = 0; while ($db->next_record()) { $temp[$db->f('port')] = intval($db->f('number')); $requests['total'] = intval($db->f('number')) + $requests['total']; } dprint_r($requests); foreach ($temp as $key => $value) { $query = sprintf( "select sum(number) as number, function, port, method from ( select sum(total) as number, function, substring_index(function,':',1) as port,substring_index(function,':',-1) as method from ngnpro_logs_functions where function like '$key:%%' and date between '%s' and '%s' group by function union all select sum(total) as number, function, substring_index(function,':',1) as port,substring_index(function,':',-1) as method from ngnpro_logs_functions_history where function like '$key:%%' and date between '%s' and '%s' group by function ) t group by function order by number desc limit 0,5", $start_date->format('Y-m-d 00:00:00'), $new_stop_date->format('Y-m-d 00:00:00'), $start_date->format('Y-m-d 00:00:00'), $new_stop_date->format('Y-m-d 00:00:00') ); #$query = "select sum(total) as number, function, substring_index(function,':',1) as port,substring_index(function,':',-1) as method from ngnpro_logs_functions where function like '$key:%' group by function order by number desc limit 0,5 "; dprint_sql("$query"); if (!$db->query($query)) { $log=sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if (!$db->num_rows()) { return array(); } $requests[$key]['total'] = 0; while ($db->next_record()) { $requests[$db->f('port')][$db->f('method')] = intval($db->f('number')); $requests[$db->f('port')]['total'] = $requests[$db->f('port')]['total'] + intval($db->f('number')); } } $end = (float) array_sum(explode(' ', microtime())); dprint("Processing time: ". sprintf("%.4f", ($end-$start))." seconds
"); $start = (float) array_sum(explode(' ', microtime())); $query = sprintf( "select sum(number) as number,function, ip from ( select total as number, function, ip from ngnpro_logs_functions where date between '%s' and '%s' group by ip,function union all select total as number, function, ip from ngnpro_logs_functions_history where date between '%s' and '%s' group by ip,function ) t group by ip,function", $start_date->format('Y-m-d 00:00:00'), $new_stop_date->format('Y-m-d 00:00:00'), $start_date->format('Y-m-d 00:00:00'), $new_stop_date->format('Y-m-d 00:00:00') ); #$query ="select total as number, function, ip from ngnpro_logs_functions group by ip,function order by number desc"; dprint_sql("$query"); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if (!$db->num_rows()) { return array(); } while ($db->next_record()) { list($port,$method) = explode(":", $db->f('function')); $requests_ip[$port][$method][$db->f('ip')] = intval($db->f('number')); } $end = (float) array_sum(explode(' ', microtime())); dprint("Processing time for getTopRequestsProvisioningNew: ". sprintf("%.4f", ($end-$start))." seconds"); return array($requests,$requests_ip); } public function getNumber($class, $start_date, $stop_date) { global $CDRTool; $temp = array(); if (!class_exists($class)) { return array(); } $db = new $class(); // Get total $query = "select sum(total) as total from ngnpro_logs where date between '". $start_date->format('Y-m-d H:i:s')."' and '".$stop_date->format('Y-m-d H:i:s')."'"; dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if (!$db->num_rows()) { return array(); } while ($db->next_record()) { $temp = array($db->f('total')); } dprint_r($temp); // Also get from archived entries $query = "select sum(total) as total from ngnpro_logs_summary where date between '". $start_date->format('Y-m-d H:i:s')."' and '".$stop_date->format('Y-m-d H:i:s')."'"; dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if (!$db->num_rows()) { return array(); } while ($db->next_record()) { $temp[0] = $temp[0]+$db->f('total'); } return $temp; } public function getData($requests, $data1) { $port_data = array(); $port_data['name'] = ""; $port_data['children'] = array(); foreach ($requests as $key => $value) { if ($key != 'total') { $children1 = array(); foreach ($requests[$key] as $key1 => $value1) { if ($key1 != 'total') { $children2 = array(); foreach ($data1[$key][$key1] as $key2 => $value2) { $children2[] = array('name'=> "$key2", 'size'=>$value2); } $children1[] = array( "name" => $key1, "children" => $children2 ); } } $port_data['children'][]=array('name' =>$key, 'children' => $children1); } } $return=json_encode($port_data); return $return; } public function printChartDonut($titlex, $good_data) { // Create the chart print "

$titlex

"; print "
"; $chart = " "; print $chart; } private function purge($class) { global $CDRTool; $interval = 547; if (!class_exists($class)) { return array(); } $db = new $class(); $query = "insert into ngnpro_logs_summary (total, date,total_time) " . "select sum(total) as number, date, sum(total_time) as data from ngnpro_logs " . "where date < DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY UNIX_TIMESTAMP(date) DIV 3600 order by date"; dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } $query = "delete from ngnpro_logs " ."where date < DATE_SUB(NOW(), INTERVAL 30 DAY)"; dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } $query = sprintf("delete from ngnpro_logs_summary where date < date_sub(now(), interval %u day)", $interval); dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } $query = sprintf("delete from ngnpro_logs_functions where date < date_sub(now(), interval %u day)", $interval); dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } $query = sprintf("delete from ngnpro_logs_functions_history where date < date_sub(now(), interval %u day)", $interval); dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } } public function getRequestsProvisioning($class, $days, $start_date, $stop_date) { global $CDRTool; $requests = array(); $period = '300'; $this->purge($class); if (!class_exists($class)) { return array(); } $db = new $class(); if ($days >= 10) { $period='600'; } else if ($days >= 20) { $period='900'; } $query = "select total as number,date from ngnpro_logs_summary where date between '" . $start_date->format('Y-m-d H:i:s') . "' and '" . $stop_date->format('Y-m-d H:i:s') . "' order by date"; dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if ($db->num_rows()) { while ($db->next_record()) { $requests[] = array($db->f('date'),(intval($db->f('number')))/60); } } $query = "select sum(total) as number,date from ngnpro_logs where date between '" . $start_date->format('Y-m-d H:i:s') . "' and '" . $stop_date->format('Y-m-d H:i:s') . "' GROUP BY UNIX_TIMESTAMP(date) DIV $period"; dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if ($db->num_rows()) { while ($db->next_record()) { $requests[] = array($db->f('date'),(intval($db->f('number')))/($period/60)); } } return json_encode($requests); } public function getRequestsTime($class, $days, $start_date, $stop_date) { global $CDRTool; $requests = array(); $period = '300'; if (!class_exists($class)) { return array(); } $start = (float) array_sum(explode(' ', microtime())); $db = new $class(); if ($days >= 10) { $period='600'; } else if ($days >= 20) { $period='900'; } //else if ($days > 20) { // $period='2400'; // } $query = "select total as number, date, total_time as data from ngnpro_logs_summary where date between '" . $start_date->format('Y-m-d H:i:s') . "' and '" . $stop_date->format('Y-m-d H:i:s') . "' order by date "; dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if ($db->num_rows()) { while ($db->next_record()) { $total= $db->f('data'); $requests[] = array($db->f('date'),($total/intval($db->f('number')))*1000); } } #$query = "select sum(total) as number, date, concat('[',group_concat(data),']') as data from ngnpro_logs_new GROUP BY UNIX_TIMESTAMP(date) DIV 60 order by date"; $query = "select sum(total) as number, date, sum(total_time) as data from ngnpro_logs where date between '" . $start_date->format('Y-m-d H:i:s') . "' and '" . $stop_date->format('Y-m-d H:i:s') . "' GROUP BY UNIX_TIMESTAMP(date) DIV $period order by date"; dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if ($db->num_rows()) { while ($db->next_record()) { $total= $db->f('data'); $requests[] = array($db->f('date'),($total/intval($db->f('number')))*1000); } } $end = (float) array_sum(explode(' ', microtime())); dprint("
Processing time for getRequestsTime: ". sprintf("%.4f", ($end-$start))." seconds
"); // echo "
";
         // print_r($requests);
         // echo "
"; return json_encode($requests); } public function printLineCharts($name, $requests, $requests_time) { $chart = "

Number of provisioning Requests

Average execution time per request

"; print $chart; } } ?> diff --git a/library/rating.php b/library/rating.php index 67c1adf..fd6124a 100644 --- a/library/rating.php +++ b/library/rating.php @@ -1,9584 +1,9584 @@ db = $db; $this->settings = $settings; if ($this->database_backend == "mysql") { $this->db->Halt_On_Error="no"; } if ($this->settings['priceDenominator']) { $this->priceDenominator = $this->settings['priceDenominator']; } if ($this->settings['priceDecimalDigits']) { $this->priceDecimalDigits = $this->settings['priceDecimalDigits']; } if ($this->settings['durationPeriodRated']) { $this->durationPeriodRated = $this->settings['durationPeriodRated']; } if ($this->settings['trafficSizeRated']) { $this->trafficSizeRated = $this->settings['trafficSizeRated']; } if ($this->settings['rate_longer_than']) { // if call is shorter than this, it has zero cost $this->rate_longer_than = $this->settings['rate_longer_than']; } if ($this->settings['min_duration']) { // if call is shorter than this, it has zero cost $this->min_duration = $this->settings['min_duration']; } if ($this->settings['increment']) { $this->increment = $this->settings['increment']; } if ($this->settings['database_backend']) { $this->database_backend = $this->settings['database_backend']; } } public function calculateAudio($dictionary) { // used for calculate rate for audio application $this->RatingTables = $dictionary['RatingTables']; $this->callId = $dictionary['callId']; $this->timestamp = $dictionary['timestamp']; $this->duration = $dictionary['duration']; $this->traffic = 2 * ($dictionary['inputTraffic'] + $dictionary['outputTraffic']); $this->DestinationId = $dictionary['DestinationId']; $this->BillingPartyId = $dictionary['BillingPartyId']; $this->domain = $dictionary['domain']; $this->gateway = $dictionary['gateway']; $this->ResellerId = $dictionary['ResellerId']; $this->aNumber = $dictionary['aNumber']; $this->cNumber = $dictionary['cNumber']; $this->ENUMtld = $dictionary['ENUMtld']; if ($this->rate_longer_than && $this->duration < $this->rate_longer_than) { //syslog(LOG_NOTICE, "Duration less than minimum $this->rate_longer_than"); $this->rateInfo .= " Duration < $this->rate_longer_than s\n"; return true; } if ($this->ENUMtld && $this->ENUMtld != 'n/a' && $this->ENUMtld != 'none' && $this->RatingTables->ENUMtlds[$this->ENUMtld]) { $this->ENUMdiscount = $this->RatingTables->ENUMtlds[$this->ENUMtld]['discount']; if (!is_numeric($this->ENUMdiscount) || $this->ENUMdiscount < 0 || $this->ENUMdiscount > 100) { syslog(LOG_NOTICE, "Error: ENUM discount for tld $this->ENUMtld must be between 0 and 100"); } } if (!$this->gateway) { $this->gateway = "0.0.0.0"; } if (!$this->duration) { $this->duration = 0; } if (!$this->traffic) { $this->traffic = 0; } $this->application=$dictionary['application']; if (!$this->application) { $this->application = 'audio'; } $durationRate = 0; $foundRates = array(); if (!$this->DestinationId) { syslog(LOG_NOTICE, "Error: Cannot calculate rate without destination id for callid=$this->callId"); return false; } if (!$this->lookupDestinationDetails()) { // get region, increment and other per destination details syslog(LOG_NOTICE, "Error: Cannot find destination details for call_id=$this->callId, dest_id=$this->DestinationId)"); return false; } if (!$this->lookupProfiles()) { // get profiles for the billing party syslog(LOG_NOTICE, "Error: Cannot find any profiles for call_id=$this->callId, dest_id=$this->DestinationId)"); return false; } // lookup discounts if any $this->lookupDiscounts(); $this->startTimeBilling = getLocalTime($this->billingTimezone, $this->timestamp); list($dateText,$timeText) = explode(" ", trim($this->startTimeBilling)); $Bdate = explode("-", $dateText); $Btime = explode(":", $timeText); $this->timestampBilling = mktime($Btime[0], $Btime[1], $Btime[2], $Bdate[1], $Bdate[2], $Bdate[0]); $this->startTimeBilling = Date("Y-m-d H:i:s", $this->timestampBilling); $this->trafficKB = number_format($this->traffic/1024, 0, "", ""); // check min_duration and increment per destination if ($this->increment >= 1) { // increase the billed duration to the next increment $this->duration = $this->increment * ceil($this->duration / $this->increment); } if ($this->max_duration && $this->duration > $this->max_duration) { // limit the maximum duration for rating $this->duration = $this->max_duration; } $this->rateSyslog = ""; if ($this->duration) { if ($this->increment >= 1) { $this->rateInfo .= " Increment: $this->increment s\n"; $this->rateSyslog .= sprintf("Increment=%s ", $this->increment); } if ($this->min_duration) { $this->rateInfo .= " Min duration: $this->min_duration s\n"; $this->rateSyslog .= sprintf("MinDuration=%s ", $this->min_duration); } if ($this->max_duration) { $this->rateInfo .= " Max duration: $this->max_duration s\n"; $this->rateSyslog .= sprintf("MaxDuration=%s ", $this->max_duration); } if ($this->max_price) { $this->rateInfo .= " Max price: $this->max_price\n"; $this->rateSyslog .= sprintf("MaxPrice=%s ", $this->max_price); } unset($IntervalsForPricing); $this->rateInfo .= " Duration: $this->duration s\n". " App: $this->application\n". " Destination: $this->DestinationId\n". " Customer: $this->CustomerProfile\n"; if ($this->region) { $this->rateInfo .= " Region: $this->region\n"; } if ($this->discount_duration || $this->discount_connect) { $this->rateInfo .= " Discount: "; } if ($this->discount_connect) { $this->rateInfo .= " connect $this->discount_connect% "; } if ($this->discount_duration) { $this->rateInfo .= " duration $this->discount_duration% "; } if ($this->discount_duration || $this->discount_connect) { $this->rateInfo .= "\n"; } if ($this->ENUMtld && $this->ENUMtld != 'none' && $this->ENUMtld != 'n/a') { $this->rateInfo .= " ENUM tld: $this->ENUMtld\n". " ENUM discount: $this->ENUMdiscount%\n"; } $i=0; $durationRatedTotal=0; // get recursively a set of arrays with rates // until we billed the whole duration while ($durationRatedTotal < $this->duration) { if ($i == "0") { $dayofweek = date("w", $this->timestampBilling); $hourofday = date("G", $this->timestampBilling); $dayofyear = date("Y-m-d", $this->timestampBilling); } else { $dayofweek = date("w", $this->timestampBilling+$durationRatedTotal); $hourofday = $foundRate['nextHourOfDay']; $dayofyear = date("Y-m-d", $this->timestampBilling+$durationRatedTotal); } $foundRate = $this->lookupRateAudio($dayofyear, $dayofweek, $hourofday, $durationRatedTotal); $durationRatedTotal = $durationRatedTotal + $foundRate['duration']; if (!$foundRate['rate']) { $this->broken_rate=true; return false; } $foundRates[] = $foundRate; $i++; if ($i > 10) { // possible loop because of wrong coding make sure we end this loop somehow $body="Rating of call $this->callId (DestId=$this->DestinationId) has more than 10 spans. It could be a serious bug.\n"; mail($this->toEmail, "CDRTool rating problem", $body, $this->extraHeaders); syslog(LOG_NOTICE, "Error: Rating of call $this->callId (DestId=$this->DestinationId) has more than 10 spans."); break; } } } $j = 0; $span = 0; foreach ($foundRates as $thisRate) { $spanPrice = 0; $span++; if ($j > 0) { $payConnect = 0; $durationForRating = $thisRate['duration']; } else { $payConnect=1; if ($this->min_duration && $this->duration < $this->min_duration) { $durationForRating = $this->min_duration; } else { $durationForRating = $thisRate['duration']; } } $connectCost = $thisRate['values']['connectCost']; $durationRate = $thisRate['values']['durationRate']; // apply discounts for connect if ($this->discount_connect) { $connectCost = $connectCost - $connectCost * $this->discount_connect / 100; } // apply discounts for duration if ($this->discount_duration) { $durationRate = $durationRate - $durationRate * $this->discount_duration / 100; } $connectCostIn = $thisRate['values']['connectCostIn']; $durationRateIn = $thisRate['values']['durationRateIn']; if ($span=="1") { $connectCostSpan = $connectCost; $this->connectCost = number_format($connectCost/$this->priceDenominator, $this->priceDecimalDigits); $connectCostSpanIn = $connectCostIn; $this->connectCostIn = number_format($connectCostIn/$this->priceDenominator, $this->priceDecimalDigits); } else { $connectCostSpan=0; $connectCostSpanIn=0; } $connectCostPrint = number_format($connectCostSpan/$this->priceDenominator, $this->priceDecimalDigits); $durationRatePrint = number_format($durationRate/$this->priceDenominator, $this->priceDecimalDigits); $connectCostPrintIn = number_format($connectCostSpanIn/$this->priceDenominator, $this->priceDecimalDigits); $durationRatePrintIn = number_format($durationRateIn/$this->priceDenominator, $this->priceDecimalDigits); if (!$connectCostSpan) $connectCostSpan=0; if (!$durationRate) $durationRate=0; if (!$connectCostSpanIn) $connectCostSpanIn=0; if (!$durationRateIn) $durationRateIn=0; if (!$this->inputTraffic) $this->inputTraffic=0; if (!$this->outputTraffic) $this->outputTraffic=0; if ($span>1) $this->rateInfo .= "--\n"; /* durationRate*durationForRating/durationPeriodRated/priceDenominator+ trafficRate/priceDenominator/trafficSizeRated*(inputTraffic+outputTraffic)/8"); $durationRate*$durationForRating/$this->durationPeriodRated/$this->priceDenominator+ $trafficRate/$this->priceDenominator/$this->trafficSizeRated*($this->inputTraffic+$this->outputTraffic)/8"); */ $spanPrice = $durationRate * $durationForRating / $this->durationPeriodRated / $this->priceDenominator; $this->price = $this->price+$spanPrice; $spanPricePrint = number_format($spanPrice, $this->priceDecimalDigits); $spanPriceIn = $durationRateIn * $durationForRating / $this->durationPeriodRated / $this->priceDenominator; $this->priceIn = $this->priceIn+$spanPriceIn; $spanPricePrintIn = number_format($spanPriceIn, $this->priceDecimalDigits); if ($span=="1" && $thisRate['profile']) { if ($connectCostIn) { $this->rateInfo .= " Connect in: $connectCostPrintIn\n"; } $this->rateInfo .= " Connect: $connectCostPrint\n". " StartTime: $this->startTimeBilling\n". "--\n"; $this->rateSyslog .= "ConnectFee=$connectCostPrint "; $this->price = $this->price + $connectCostSpan / $this->priceDenominator * $payConnect; $this->priceIn = $this->priceIn + $connectCostSpanIn / $this->priceDenominator * $payConnect; } $this->rateInfo .= " Span: $span\n". " Duration: $durationForRating s\n"; $this->rateSyslog .= sprintf( "CallId=%s Span=%s Duration=%s DestId=%s %s", $this->callId, $span, $durationForRating, $this->DestinationId, $thisRate['customer'] ); if ($thisRate['profile']) { $this->rateInfo .= " ProfileId: $thisRate[profile] / $thisRate[day]\n". " RateId: $thisRate[rate] / $thisRate[interval]h\n". " Rate: $durationRatePrint / $this->durationPeriodRated s\n". " Price: $spanPricePrint\n"; if ($spanPriceIn) { $this->rateInfo .= " Price in: $spanPricePrintIn\n"; } $this->rateSyslog .= sprintf( " Profile=%s Period=%s Rate=%s Interval=%s Cost=%s/%s", $thisRate['profile'], $thisRate['day'], $thisRate['rate'], $thisRate['interval'], $durationRatePrint, $this->durationPeriodRated ); } else { $this->rateInfo .= " ProfileId: none\n". " RateId: none\n"; $this->rateSyslog .= " Profile=none, Rate=none"; } $this->rateSyslog .= " Price=".sprintf("%.4f", $spanPrice); $this->rateSyslog .= " PriceIn=".sprintf("%.4f", $spanPriceIn); if ($this->discount_connect) { $this->rateSyslog .= sprintf(" DisCon=%s", $this->discount_connect); } if ($this->discount_duration) { $this->rateSyslog .= sprintf(" DisDur=%s", $this->discount_duration); } syslog(LOG_NOTICE, $this->rateSyslog); $j++; } if ($this->priceIn) { $this->rateInfo .= "--\n". " Price out: ".sprintf("%.4f", $this->price)."\n". " Price in: ".sprintf("%.4f", $this->priceIn)."\n". " Margin: ".sprintf("%.4f", $this->price-$this->priceIn)."\n"; } $this->rateInfo=trim($this->rateInfo); if ($this->max_price && $this->price > $this->max_price) { $this->price = $this->max_price; } if ($this->ENUMdiscount) { $this->priceBeforeDiscount = sprintf("%.4f", $this->price); $this->price = $this->price - $this->price * $this->ENUMdiscount / 100; $this->price = sprintf("%.4f", $this->price); $this->rateInfo .= "\n--\n". " Total: $this->priceBeforeDiscount\n". " Total after discount: $this->price\n"; } $this->price = sprintf("%.4f", $this->price); $this->pricePrint = number_format($this->price, $this->priceDecimalDigits); return true; } public function calculateMessage($dictionary) { // used for calculate rate for SMS application $this->RatingTables = $dictionary['RatingTables']; $this->callId = $dictionary['callId']; $this->timestamp = $dictionary['timestamp']; $this->DestinationId = $dictionary['DestinationId']; $this->BillingPartyId = $dictionary['BillingPartyId']; $this->domain = $dictionary['domain']; $this->gateway = $dictionary['gateway']; $this->ResellerId = $dictionary['ResellerId']; $this->aNumber = $dictionary['aNumber']; $this->cNumber = $dictionary['cNumber']; if (!$this->gateway) { $this->gateway = "0.0.0.0"; } $this->application = 'sms'; $foundRates=array(); if (!$this->DestinationId) { syslog(LOG_NOTICE, "Error calculateMessage(): Cannot calculate rate without destination id"); return false; } if (!$this->lookupProfiles()) { // get profiles for the billing party syslog(LOG_NOTICE, "Error: calculateMessage() Cannot find any profiles for call_id=$this->callId, dest_id=$this->DestinationId)"); return false; } // lookup discounts if any $this->lookupDiscounts(); $this->startTimeBilling = getLocalTime($this->billingTimezone, $this->timestamp); list($dateText,$timeText) = explode(" ", trim($this->startTimeBilling)); $Bdate = explode("-", $dateText); $Btime = explode(":", $timeText); $this->timestampBilling = mktime($Btime[0], $Btime[1], $Btime[2], $Bdate[1], $Bdate[2], $Bdate[0]); $dayofweek = date("w", $this->timestampBilling); $hourofday = date("G", $this->timestampBilling); $dayofyear = date("Y-m-d", $this->timestampBilling); $this->rateInfo .= " App: sms\n". " Destination: $this->DestinationId\n". " Customer: $this->CustomerProfile\n"; if ($this->region) { $this->rateInfo .= " Region: $this->region\n"; } if ($this->discount_duration || $this->discount_connect) { $this->rateInfo .= " Discount: "; } if ($this->discount_connect) { $this->rateInfo .= " connect $this->discount_connect% "; } if ($this->discount_duration || $this->discount_connect) { $this->rateInfo .= "\n"; } $foundRate = $this->lookupRateMessage($dayofyear, $dayofweek, $hourofday); if (is_array($foundRate)) { $this->price = number_format($foundRate['values']['connectCost'] / $this->priceDenominator, $this->priceDecimalDigits); $this->price = sprintf("%.4f", $this->price); $this->pricePrint = $this->price; $this->rateInfo .= " ProfileId: $foundRate[profile] / $foundRate[day]\n". " RateId: $foundRate[rate]\n". " Price: $this->price\n"; return true; } else { return false; } } private function lookupDiscounts() { // get discounts for customer per region if set otherwise per destination id if (!$this->CustomerProfile) { return false; } if ($this->region) { $_field = 'region'; $_value = $this->region; } else { $_field = 'destination'; $_value = $this->DestinationId; } if ($this->CustomerProfile == 'default') { $query = sprintf( "select * from billing_discounts where subscriber = '' and domain = '' and gateway = '' and application = '%s' and %s = '%s' ", addslashes($this->application), addslashes($_field), addslashes($_value) ); } else { $els = explode("=", $this->CustomerProfile); $query = sprintf( "select * from billing_discounts where %s = '%s' and application = '%s' and %s = '%s' ", addslashes($els[0]), addslashes($els[1]), addslashes($this->application), addslashes($_field), addslashes($_value) ); } // mysql backend if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return false; } if ($this->db->num_rows()) { $this->db->next_record(); if ($this->db->f('connect') > 0 && $this->db->f('connect') <=100) { $this->discount_connect = $this->db->f('connect'); } if ($this->db->f('duration') > 0 && $this->db->f('duration') <=100) { $this->discount_duration = $this->db->f('duration'); } } return true; } private function lookupDestinationDetails() { // get rating related details for the destination id if (!$this->DestinationId) { syslog(LOG_NOTICE, "Error: Cannot lookup destination details without a destination id"); return false; } // mysql backend $query = sprintf( "select * from destinations where dest_id = '%s' and (reseller_id = %d or reseller_id = 0) order by reseller_id desc limit 1 ", addslashes($this->DestinationId), addslashes($this->ResellerId) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return false; } if ($this->db->num_rows()) { $this->db->next_record(); $this->region = $this->db->Record['region']; $this->max_duration = $this->db->Record['max_duration']; $this->max_price = $this->db->Record['max_price']; if ($this->db->Record['increment']) { $this->increment = $this->db->Record['increment']; } if ($this->db->Record['min_duration']) { $this->min_duration = $this->db->Record['min_duration']; } } return true; } private function lookupProfiles() { unset($this->allProfiles); /* lookup the profile_name in billing_customers in the following order: subscriber, username@gateway, domain, gateway (based on $dayofweek): - profile_workday matches days [1-5] (Work-day) - profile_weekend matches days [6-0] (Week-end) - week starts with 0 Sunday and ends with 6 Saturday Alternatively look for profile_workday_alt and profile_weekend_alt If no rates are found for destination in the profileX, than lookup rates in profileX_alt */ // mysql backend list($username, $domain) = explode("@", $this->BillingPartyId); $trusted_peer_account = sprintf("%s@%s", $username, $this->gateway); $query = sprintf( "select * from billing_customers where (subscriber = '%s' and domain = '' and gateway = '' ) or (subscriber = '%s' and domain = '' and gateway = '' ) or (domain = '%s' and subscriber = '' and gateway = '' ) or (gateway = '%s' and subscriber = '' and domain = '' ) or (subscriber = '' and domain = '' and gateway = '' ) order by subscriber desc, domain desc, gateway desc limit 1 ", addslashes($this->BillingPartyId), addslashes($trusted_peer_account), addslashes($this->domain), addslashes($this->gateway) ); dprint_sql($query); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return false; } if ($this->db->num_rows()) { $this->db->next_record(); if ($this->db->Record['subscriber']) { if ($this->db->Record['subscriber'] == $trusted_peer_account) { $this->CustomerProfile = sprintf("remote_account=%s", $this->db->Record['subscriber']); } else { $this->CustomerProfile = sprintf("local_account=%s", $this->db->Record['subscriber']); } } elseif ($this->db->Record['domain']) { $this->CustomerProfile = sprintf("domain=%s", $this->db->Record['domain']); } elseif ($this->db->Record['gateway']) { $this->CustomerProfile = sprintf("trusted_peer=%s", $this->db->Record['gateway']); } else { $this->CustomerProfile = "default"; } if (!$this->db->Record['profile_name1']) { $log = sprintf( "Error: customer %s (id=%d) has no weekday profile assigned in profiles table", $this->CustomerProfile, $this->db->Record['id'] ); syslog(LOG_NOTICE, $log); return false; } if (!$this->db->Record['profile_name2']) { $log = sprintf( "Error: customer %s (id=%d) has no weekend profile assigned in profiles table", $this->CustomerProfile, $this->db->Record['id'] ); syslog(LOG_NOTICE, $log); return false; } if (!$this->db->Record['timezone']) { $log = sprintf( "Error: missing timezone for customer %s", $this->CustomerProfile ); syslog(LOG_NOTICE, $log); return false; } $this->billingTimezone = $this->db->Record['timezone']; $this->allProfiles = array( "profile_workday" => $this->db->Record['profile_name1'], "profile_weekend" => $this->db->Record['profile_name2'], "profile_workday_alt" => $this->db->Record['profile_name1_alt'], "profile_weekend_alt" => $this->db->Record['profile_name2_alt'], "timezone" => $this->db->Record['timezone'] ); if ($this->db->Record['increment']) { $this->increment = $this->db->Record['increment']; } if ($this->db->Record['min_duration']) { $this->min_duration = $this->db->Record['min_duration']; } return true; } else { $log = sprintf( "Error: no customer found in billing_customers table for billing party=%s, domain=%s, gateway=%s", $this->BillingPartyId, $this->domain, $this->gateway ); syslog(LOG_NOTICE, $log); return false; } } private function lookupRateAudio($dayofyear, $dayofweek, $hourofday, $durationRatedAlready) { /* // Required information from CDR structure $this->BillingPartyId # calling subscriber $this->domain # multiple callers may belong to same domain $this->gateway # multiple callers may belong to the same gateway $this->cNumber # E164 destination prefixed with 00 (e.g. 0041 CH) $this->DestinationId # longest matched DestinationId $this->region # region the destination belongs to // pertinent to the curent rating SPAN (a span = same profile like evening hours) $hourofday # which hour of teh day started for peak/ofpeak rates $dayofweek # which day of the week for matching profiles $dayofyear # which day of the year for matching holidays $durationRatedAlready= the full duration for which a profile is defined (e.g. 0800-1800) // the call is called recursively until the $durationRatedAlready = $CDR->duration // when a call spans multiple profiles. If we span multiple profiles we must call // the function again to lookup the corect rates Rating logic ------------ 1. using the profile_name found, lookup the rate_name based on $hourofday in billing_profiles - the day may be split in maximum 4 periods - each day starts with hour 0 and ends with hour 24 - rate_name1 defines the first interval after hour 0 - rate_name2 defines the first interval after rate_name1 - rate_name3 defines the first interval after rate_name2 - rate_name4 defines the first interval after rate_name3 When the hour matches an interval use the rate_nameX found to lookup the rate in billing_rates - if no record is found use the rate called 'default' 2. lookup in billing_rates the record having same name found above and billing_rates.destination = $this->DestinationId - return an array with all the values to $this->calculateAudio() function that called us */ // get work-day or weekend profile if ($this->RatingTables->holidays[$dayofyear]) { $this->profileName = $this->allProfiles['profile_weekend']; $this->profileNameAlt = $this->allProfiles['profile_weekend_alt']; $this->PeriodOfProfile = "weekend"; } else { if ($dayofweek >=1 && $dayofweek <=5) { $this->profileName = $this->allProfiles['profile_workday']; $this->profileNameAlt = $this->allProfiles['profile_workday_alt']; $this->PeriodOfProfile = "weekday"; } else { $this->profileName = $this->allProfiles['profile_weekend']; $this->profileNameAlt = $this->allProfiles['profile_weekend_alt']; $this->PeriodOfProfile = "weekend"; } } // get rate for the time of the day $timestampNextProfile = $this->timestampBilling + $durationRatedAlready; $profileValues = $this->RatingTables->profiles[$this->profileName]; if (is_array($profileValues)) { $this->profileNameLog = $this->profileName; if ($hourofday < $profileValues['hour1']) { $this->rateName = $profileValues['rate_name1']; $this->timeInterval = "0-".$profileValues['hour1']; $foundProfile = $profileValues['hour1']; $this->nextProfile = $profileValues['hour1']; } elseif ($hourofday < $profileValues['hour2']) { $this->rateName = $profileValues['rate_name2']; $this->timeInterval = $profileValues['hour1']."-".$profileValues['hour2']; $foundProfile = $profileValues['hour2']; $this->nextProfile = $profileValues['hour2']; } elseif ($hourofday < $profileValues['hour3']) { $this->rateName = $profileValues['rate_name3']; $this->timeInterval = $profileValues['hour2']."-".$profileValues['hour3']; $foundProfile = $profileValues['hour3']; $this->nextProfile = $profileValues['hour3']; } elseif ($hourofday < $profileValues['hour4']) { $this->rateName = $profileValues['rate_name4']; $this->timeInterval = $profileValues['hour3']."-".$profileValues['hour4']; $foundProfile = $profileValues['hour4']; $this->nextProfile = 0; } if ($this->rateName) { $found_history=false; //get historical rating if exists if (is_array($this->RatingTables->ratesHistory[$this->rateName][$this->DestinationId][$this->application])) { $h=0; foreach (($this->RatingTables->ratesHistory[$this->rateName][$this->DestinationId][$this->application]) as $_idx) { $h++; if ($_idx['startDate'] <= $this->timestamp) { if ($_idx['endDate'] > $this->timestamp) { // found historical rate $found_history=true; $this->rateValues=$_idx; break; } else { $_log = sprintf("Interval missmatch %s < %s", $_idx['endDate'], $this->timestamp); continue; } } else { $_log = sprintf("Interval missmatch %s > %s", $_idx['startDate'], $this->timestamp); continue; } } } if (!$found_history) { if ($this->region) { $this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->region); if (!$this->rateValues) { // try the destination as last resort $this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->DestinationId); } } else { $this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->DestinationId); } } } } $profileValuesAlt = $this->RatingTables->profiles[$this->profileNameAlt]; if (!$this->rateValues && is_array($profileValuesAlt)) { $this->profileNameLog = $this->profileNameAlt; if ($hourofday < $profileValuesAlt['hour1']) { $this->rateName = $profileValuesAlt['rate_name1']; $this->timeInterval = "0-".$profileValuesAlt['hour1']; $foundProfile = $profileValuesAlt['hour1']; $this->nextProfile = $profileValuesAlt['hour1']; } elseif ($hourofday < $profileValuesAlt['hour2']) { $this->rateName = $profileValuesAlt['rate_name2']; $this->timeInterval = $profileValuesAlt['hour1']."-".$profileValuesAlt['hour2']; $foundProfile = $profileValuesAlt['hour2']; $this->nextProfile = $profileValuesAlt['hour2']; } elseif ($hourofday < $profileValuesAlt['hour3']) { $this->rateName = $profileValuesAlt['rate_name3']; $this->timeInterval = $profileValuesAlt['hour2']."-".$profileValuesAlt['hour3']; $foundProfile = $profileValuesAlt['hour3']; $this->nextProfile = $profileValuesAlt['hour3']; } elseif ($hourofday < $profileValuesAlt['hour4']) { $this->rateName = $profileValuesAlt['rate_name4']; $this->timeInterval = $profileValuesAlt['hour3']."-".$profileValuesAlt['hour4']; $foundProfile = $profileValuesAlt['hour4']; $this->nextProfile = 0; } if ($this->rateName) { $found_history=false; //get historical rating if exists if (is_array($this->RatingTables->ratesHistory[$this->rateName][$this->DestinationId][$this->application])) { $h=0; foreach (($this->RatingTables->ratesHistory[$this->rateName][$this->DestinationId][$this->application]) as $_idx) { $h++; if ($_idx['startDate'] <= $this->timestamp) { if ($_idx['endDate'] > $this->timestamp) { // found historical rate $found_history=true; $this->rateValues=$_idx; break; } else { $_log = sprintf("Interval missmatch %s < %s", $_idx['endDate'], $this->timestamp); continue; } } else { $_log = sprintf("Interval missmatch %s > %s", $_idx['startDate'], $this->timestamp); continue; } } } if (!$found_history) { if ($this->region) { $this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->region); // try destination as last resort if (!$this->rateValues) { $this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->DestinationId); } } else { $this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->DestinationId); } } } } if (!$this->rateValues) { $this->rateNotFound=true; $log = sprintf( "Error: Cannot find rates for callid=%s, billing party=%s, customer %s, gateway=%s, destination=%s, profile=%s, app=%s", $this->callId, $this->BillingPartyId, $this->CustomerProfile, $this->gateway, $this->DestinationId, $this->profileName, $this->application ); syslog(LOG_NOTICE, $log); return false; } if ($this->nextProfile == "24") $this->nextProfile = 0; $DST = Date("I", $timestampNextProfile); if (!$this->nextProfile) { // check it we change daylight saving time tomorrow // yes this cann happen and we must apply a different rate $timestampNextProfile =$timestampNextProfile+24*3600; $DSTNext = Date("I", $timestampNextProfile); if ($DST != $DSTNext) { if ($DSTNext==0) { $timestampNextProfile = $timestampNextProfile+3600; } elseif ($DSTNext==1) { $timestampNextProfile = $timestampNextProfile-3600; } } } // see if we have minimum duration or increment if ($this->rateValues['increment']) { // increase the billed duration to the next increment $this->duration = $this->rateValues['increment'] * ceil($this->duration / $this->rateValues['increment']); } $durationToRate=$this->duration-$durationRatedAlready; $month = Date("m", $timestampNextProfile); $day = Date("d", $timestampNextProfile); $year = Date("Y", $timestampNextProfile); $nextProfileTimestamp = mktime($this->nextProfile, 0, 0, $month, $day, $year); $npdt=Date("Y-m-d H:i", $nextProfileTimestamp); $timeTillNextProfile = $nextProfileTimestamp - $this->timestampBilling; if ($durationToRate > $timeTillNextProfile) { $diff = $durationToRate - $timeTillNextProfile; $this->durationRated = $timeTillNextProfile; } else { $this->durationRated = $durationToRate; } $rate = array( "customer" => $this->CustomerProfile, "application" => $this->application, "profile" => $this->profileNameLog, "day" => $this->PeriodOfProfile, "destinationId" => $this->DestinationId, "duration" => $this->durationRated, "rate" => $this->rateName, "values" => $this->rateValues, "interval" => $this->timeInterval, "nextHourOfDay" => $this->nextProfile ); return $rate; } private function lookupRateMessage($dayofyear, $dayofweek, $hourofday) { /* // Required information from CDR structure $this->BillingPartyId # calling subscriber $this->domain # multiple callers may belong to same domain $this->gateway # multiple callers may belong to the same gateway $this->cNumber # E164 destination prefixed with 00 (e.g. 0041 CH) $this->DestinationId # longest matched DestinationId $this->region # region the destination belongs to // pertinent to the curent rating SPAN (a span = same profile like evening hours) $hourofday # which hour of teh day started for peak/ofpeak rates $dayofweek # which day of the week for matching profiles $dayofyear # which day of the year for matching holidays $durationRatedAlready= the full duration for which a profile is defined (e.g. 0800-1800) // the call is called recursively until the $durationRatedAlready = $CDR->duration // when a call spans multiple profiles. If we span multiple profiles we must call // the function again to lookup the corect rates Rating logic ------------ 1. using the profile_name found, lookup the rate_name based on $hourofday in billing_profiles - the day may be split in maximum 4 periods - each day starts with hour 0 and ends with hour 24 - rate_name1 defines the first interval after hour 0 - rate_name2 defines the first interval after rate_name1 - rate_name3 defines the first interval after rate_name2 - rate_name4 defines the first interval after rate_name3 When the hour matches an interval use the rate_nameX found to lookup the rate in billing_rates - if no record is found use the rate called 'default' 2. lookup in billing_rates the record having same name found above and billing_rates.destination = $this->DestinationId - return an array with all the values to $this->calculateAudio() function that called us */ // get work-day or weekend profile if ($this->RatingTables->holidays[$dayofyear]) { $this->profileName = $this->allProfiles['profile_weekend']; $this->profileNameAlt = $this->allProfiles['profile_weekend_alt']; $this->PeriodOfProfile = "weekend"; } else { if ($dayofweek >=1 && $dayofweek <=5) { $this->profileName = $this->allProfiles['profile_workday']; $this->profileNameAlt = $this->allProfiles['profile_workday_alt']; $this->PeriodOfProfile = "weekday"; } else { $this->profileName = $this->allProfiles['profile_weekend']; $this->profileNameAlt = $this->allProfiles['profile_weekend_alt']; $this->PeriodOfProfile = "weekend"; } } // get rate for the time of the day $timestampNextProfile = $this->timestampBilling + $durationRatedAlready; $profileValues = $this->RatingTables->profiles[$this->profileName]; if (is_array($profileValues)) { $this->profileNameLog = $this->profileName; if ($hourofday < $profileValues['hour1']) { $this->rateName = $profileValues['rate_name1']; $this->timeInterval = "0-".$profileValues['hour1']; $foundProfile = $profileValues['hour1']; } elseif ($hourofday < $profileValues['hour2']) { $this->rateName = $profileValues['rate_name2']; $this->timeInterval = $profileValues['hour1']."-".$profileValues['hour2']; $foundProfile = $profileValues['hour2']; } elseif ($hourofday < $profileValues['hour3']) { $this->rateName = $profileValues['rate_name3']; $this->timeInterval = $profileValues['hour2']."-".$profileValues['hour3']; $foundProfile = $profileValues['hour3']; } elseif ($hourofday < $profileValues['hour4']) { $this->rateName = $profileValues['rate_name4']; $this->timeInterval = $profileValues['hour3']."-".$profileValues['hour4']; $foundProfile = $profileValues['hour4']; } if ($this->rateName) { if ($this->region) { $this->rateValues=$this->lookupRateValuesMessage($this->rateName, $this->region); if (!$this->rateValues) { // try the destination as last resort $this->rateValues=$this->lookupRateValuesMessage($this->rateName, $this->DestinationId); } } else { $this->rateValues=$this->lookupRateValuesMessage($this->rateName, $this->DestinationId); } } } $profileValuesAlt = $this->RatingTables->profiles[$this->profileNameAlt]; if (!$this->rateValues && is_array($profileValuesAlt)) { $this->profileNameLog = $this->profileNameAlt; if ($hourofday < $profileValuesAlt['hour1']) { $this->rateName = $profileValuesAlt['rate_name1']; $this->timeInterval = "0-".$profileValuesAlt['hour1']; $foundProfile = $profileValuesAlt['hour1']; } elseif ($hourofday < $profileValuesAlt['hour2']) { $this->rateName = $profileValuesAlt['rate_name2']; $this->timeInterval = $profileValuesAlt['hour1']."-".$profileValuesAlt['hour2']; $foundProfile = $profileValuesAlt['hour2']; } elseif ($hourofday < $profileValuesAlt['hour3']) { $this->rateName = $profileValuesAlt['rate_name3']; $this->timeInterval = $profileValuesAlt['hour2']."-".$profileValuesAlt['hour3']; $foundProfile = $profileValuesAlt['hour3']; } elseif ($hourofday < $profileValuesAlt['hour4']) { $this->rateName = $profileValuesAlt['rate_name4']; $this->timeInterval = $profileValuesAlt['hour3']."-".$profileValuesAlt['hour4']; $foundProfile = $profileValuesAlt['hour4']; } if ($this->rateName) { if ($this->region) { $this->rateValues = $this->lookupRateValuesMessage($this->rateName, $this->region); // try destination as last resort if (!$this->rateValues) { $this->rateValues = $this->lookupRateValuesMessage($this->rateName, $this->DestinationId); } } else { $this->rateValues = $this->lookupRateValuesMessage($this->rateName, $this->DestinationId); } } } if (!$this->rateValues) { $this->rateNotFound=true; $log=sprintf( "Error: Cannot find rates for callid=%s, billing party=%s, customer %s, gateway=%s, destination=%s, profile=%s, app=sms", $this->callId, $this->BillingPartyId, $this->CustomerProfile, $this->gateway, $this->DestinationId, $this->profileName ); syslog(LOG_NOTICE, $log); return false; } $rate = array( "customer" => $this->CustomerProfile, "application" => $this->application, "profile" => $this->profileNameLog, "day" => $this->PeriodOfProfile, "destinationId" => $this->DestinationId, "rate" => $this->rateName, "values" => $this->rateValues, ); return $rate; } public function MaxSessionTime($dictionary) { // Used for prepaid application to return maximum session time based on a prepaid balance $this->rateValuesCache = array(); $this->MaxSessionTimeSpans = 0; $durationRate = 0; ///////////////////////////////////////////////////// // required fields passed from the CDR structure // $this->timestamp = time(); $this->callId = $dictionary['callId']; $this->DestinationId = $dictionary['DestinationId']; $this->BillingPartyId = $dictionary['BillingPartyId']; $this->domain = $dictionary['domain']; $this->duration = $dictionary['duration']; $this->aNumber = $dictionary['aNumber']; $this->cNumber = $dictionary['cNumber']; $this->gateway = $dictionary['gateway']; $this->RatingTables = $dictionary['RatingTables']; $this->application = $dictionary['application']; $this->ResellerId = $dictionary['ResellerId']; $Balance = $dictionary['Balance']; if (!$this->application) $this->application='audio'; if (!$this->DestinationId) { $log = sprintf("Error: no DestinationId supplied in MaxSessionTime()"); syslog(LOG_NOTICE, $log); return false; } if (!$this->lookupDestinationDetails()) { return false; } if (!$this->lookupProfiles()) { return false; } $this->startTimeBilling = getLocalTime($this->billingTimezone, $this->timestamp); list($dateText,$timeText) = explode(" ", trim($this->startTimeBilling)); $Bdate = explode("-", $dateText); $Btime = explode(":", $timeText); $this->timestampBilling = mktime($Btime[0], $Btime[1], $Btime[2], $Bdate[1], $Bdate[2], $Bdate[0]); $this->startTimeBilling = Date("Y-m-d H:i:s", $this->timestampBilling); $i=0; $durationRatedTotal=0; while ($Balance > 0) { $span++; $this->MaxSessionTimeSpans++; if ($i == "0") { $dayofweek = date("w", $this->timestampBilling); $hourofday = date("G", $this->timestampBilling); $dayofyear = date("Y-m-d", $this->timestampBilling); } else { $dayofweek = date("w", $this->timestampBilling+$durationRatedTotal); $hourofday = $foundRate['nextHourOfDay']; $dayofyear = date("Y-m-d", $this->timestampBilling+$durationRatedTotal); } $foundRate = $this->lookupRateAudio($dayofyear, $dayofweek, $hourofday, $durationRatedTotal); if ($this->rateNotFound) { // break here to avoid loops break; } $thisRate=$foundRate; if ($j > 0) { $payConnect=0; $durationForRating = $thisRate['duration']; } else { $payConnect=1; if ($this->min_duration && $this->duration < $this->min_duration) { $durationForRating=$this->min_duration; } else { $durationForRating=$thisRate['duration']; } } $j++; $connectCost = $thisRate['values']['connectCost']; $durationRate = $thisRate['values']['durationRate']; if ($span=="1" && !$dictionary['skipConnectCost']) { $this->connectCost=number_format($connectCost/$this->priceDenominator, $this->priceDecimalDigits); $connectCostSpan=$connectCost; $setupBalanceRequired=$connectCost/$this->priceDenominator; if ($connectCost && $Balance <= $setupBalanceRequired) { syslog(LOG_NOTICE, "Balance too small: $Balance <= $setupBalanceRequired"); return false; } $Balance = $Balance-$setupBalanceRequired; } else { $connectCostSpan=0; $setupBalanceRequired=0; } $connectCostPrint = number_format($connectCostSpan/$this->priceDenominator, $this->priceDecimalDigits); $durationRatePrint = number_format($durationRate/$this->priceDenominator, $this->priceDecimalDigits); $spanPrice = $this->price+$setupBalanceRequired*$payConnect+ $durationRate*$durationForRating/$this->durationPeriodRated/$this->priceDenominator; if ($Balance > $spanPrice) { $Balance = $Balance-$spanPrice; $durationRatedTotal = $durationRatedTotal+ $foundRate['duration']; } else { $durationAllowedinThisSpan = $Balance / $durationRate * $this->durationPeriodRated * $this->priceDenominator; $rateOfThisSpan=$durationRate/$this->priceDenominator; $durationRatedTotal=$durationRatedTotal + $durationAllowedinThisSpan; $Balance=$Balance-$spanPrice; return $durationRatedTotal; } if ($durationRatedTotal >= $this->duration) { return sprintf("%f", $durationRatedTotal); } $i++; if ($i>10) { return sprintf("%f", $durationRatedTotal); break; } } return false; } private function lookupRateValuesAudio($rateName, $DestinationId) { if (is_array($this->rateValuesCache[$rateName][$DestinationId][$this->application])) { return $this->rateValuesCache[$rateName][$DestinationId][$this->application]; } if ($this->settings['split_rating_table']) { if ($rateName) { $table="billing_rates_".$rateName; } else { $table="billing_rates_default"; } $query = sprintf( "select * from %s where destination = '%s' and application = '%s'", addslashes($table), addslashes($DestinationId), addslashes($this->application) ); } else { $table = "billing_rates"; $query = sprintf( "select * from %s where name = '%s' and destination = '%s' and application = '%s'", addslashes($table), addslashes($rateName), addslashes($DestinationId), addslashes($this->application) ); } // mysql backend if (!$this->db->query($query)) { if ($this->db->Errno != 1146) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return false; } // try the main table $query = sprintf( "select * from billing_rates where name = '%s' and destination = '%s' and application = '%s'", addslashes($rateName), addslashes($DestinationId), addslashes($this->application) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return false; } } if ($this->db->num_rows()) { $this->db->next_record(); $values = array( "connectCost" => $this->db->Record['connectCost'], "durationRate" => $this->db->Record['durationRate'], "connectCostIn" => $this->db->Record['connectCostIn'], "durationRateIn" => $this->db->Record['durationRateIn'] ); // cache values $this->rateValuesCache[$rateName][$DestinationId][$this->application] = $values; return $values; } else { return false; } } private function lookupRateValuesMessage($rateName, $DestinationId) { if (is_array($this->rateValuesCache[$rateName][$DestinationId]['sms'])) { return $this->rateValuesCache[$rateName][$DestinationId]['sms']; } if ($this->settings['split_rating_table']) { if ($rateName) { $table = "billing_rates_".$rateName; } else { $table = "billing_rates_default"; } $query = sprintf( "select * from %s where (destination = '%s' or destination = '') and application = 'sms' order by destination desc limit 1", addslashes($table), addslashes($DestinationId) ); } else { $table = "billing_rates"; $query = sprintf( "select * from %s where name = '%s' and (destination = '%s' or destination = '') and application = 'sms' order by destination desc limit 1", addslashes($table), addslashes($rateName), addslashes($DestinationId) ); } // mysql backend if (!$this->db->query($query)) { if ($this->db->Errno != 1146) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return false; } // try the main table // lookup rate from MySQL $query = sprintf( "select * from billing_rates where name = '%s' and (destination = '%s' or destination = '') and application = 'sms' order by destination desc limit 1", addslashes($rateName), addslashes($DestinationId) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return false; } } if ($this->db->num_rows()) { $this->db->next_record(); $values = array( "connectCost" => $this->db->Record['connectCost'] ); // cache values $this->rateValuesCache[$rateName][$DestinationId]['sms']=$values; return $values; } else { return false; } } } class RatingTables { var $database_backend = 'mysql'; var $csv_export=array( "destinations" => "destinations.csv", "billing_customers" => "customers.csv", "billing_profiles" => "profiles.csv", "billing_rates" => "rates.csv", "billing_rates_history" => "ratesHistory.csv", "billing_discounts" => "discounts.csv", "billing_enum_tlds" => "enumtld.csv", "prepaid" => "prepaid.csv", "quota_usage" => "quotausage.csv" ); var $csv_import = array( "destinations" => "destinations.csv", "billing_customers" => "customers.csv", "billing_profiles" => "profiles.csv", "billing_rates" => "rates.csv", "billing_rates_history" => "ratesHistory.csv", "billing_discounts" => "discounts.csv" ); var $previously_imported_files = 0; var $maxrowsperpage = 15; var $insertDomainOption = array(); var $delimiter = ","; var $filesToImport = array(); var $importFilesPatterns = array( 'ratesHistory', 'rates', 'profiles', 'destinations', 'discounts', 'customers' ); var $mustReload = false; var $web_elements = array( 'table', 'export', 'web_task', 'subweb_task', 'confirmDelete', 'confirmCopy', 'next', 'id', 'search_text', 'ReloadRatingTables', 'account', 'balance', 'fromRate', 'toRate', 'sessionId' ); var $requireReload = array('destinations'); var $whereResellerFilter = " (1=1) "; var $cvs_import_dir = "/var/spool/cdrtool"; var $tables = array( "destinations" => array( "name" => "Destinations", "skip_math" => true, "keys" => array( "id" ), "exceptions" => array(), "order" => "dest_id ASC", "domainFilterColumn" => "domain", "fields" => array( "gateway" => array( "size" => 15, "checkType" => 'ip', "name" => "Trusted peer" ), "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller" ), "domain" => array( "size" => 15, "name" => "Domain", "checkType" => 'domain', "class" => "span2" ), "subscriber" => array( "size" => 15, "checkType" => 'sip_account', "name" => "Subscriber", "class" => "span2" ), "dest_id" => array( "size" => 12, "name" => "Destination", ), "region" => array( "size" => 10, "name" => "Region" ), "dest_name" => array( "size" => 20, "name" => "Description", "class" => "span2" ), "increment" => array( "size" => 3, "checkType" => 'numeric', "name" => "Incr" ), "min_duration" => array( "size" => 3, "checkType" => 'numeric', "name" => "Min Dur" ), "max_duration" => array( "size" => 5, "checkType" => 'numeric', "name" => "Max Dur" ), "max_price" => array( "size" => 8, "checkType" => 'numeric', "name" => "Max Price" ) ) ), "billing_customers" => array( "name" => "Customers", "skip_math" => true, "keys" => array("id"), "domainFilterColumn" => "domain", "fields" => array( "gateway" => array( "size" => 15, "checkType" => 'ip', "name" => "Trusted Peer" ), "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller" ), "domain" => array( "size" => 15, "checkType" => 'domain', "name" => "Domain", "class" => "span2" ), "subscriber" => array( "size" => 25, "checkType" => 'sip_account', "name" => "Subscriber", "class" => "span2" ), "profile_name1" => array( "size" => 10, "name" => "Profile WD" ), "profile_name1_alt" => array( "size" => 8, "name" => "Fallback" ), "profile_name2" => array( "size" => 10, "name" => "Profile WE" ), "profile_name2_alt" => array( "size" => 8, "name" => "Fallback" ), "timezone" => array( "size" => 16, "name" => "Timezone", "class" => "span2" ), "increment" => array( "size" => 3, "checkType" => 'numeric', "name" => "Incr" ), "min_duration" => array( "size" => 3, "checkType" => 'numeric', "name" => "Min Dur" ) ) ), "billing_discounts" => array( "name" => "Discounts", "keys" => array("id"), "domainFilterColumn" => "domain", "fields" => array( "gateway" => array( "size" => 15, "checkType" => 'ip', "name" => "Trusted Peer" ), "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller" ), "domain" => array( "size" => 15, "checkType" => 'domain', "name" => "Domain", "class" => "span2" ), "subscriber" => array( "size" => 25, "checkType" => 'sip_account', "name" => "Subscriber", "class" => "span2" ), "application" => array( "size" => 6, "name" => "App" ), "destination" => array( "size" => 10, "name" => "Destination" ), "region" => array( "size" => 8, "name" => "Region" ), "connect" => array( "size" => 5, "name" => "Connect" ), "duration" => array( "size" => 5, "name" => "Duration" ) ) ), "billing_profiles" => array( "name" => "Profiles", "skip_math" => true, "keys" => array("id"), "exceptions" => array(), "size" => 6, "fields" => array( "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller" ), "name" => array( "size" => 12, "name" => "Profile", "class" => "span2" ), "rate_name1" => array( "size" => 12, "name" => "Rate 1" ), "hour1" => array( "size" => 3, "checkType" => 'numeric', "name" => "00-H1" ), "rate_name2" => array( "size" => 12, "name" => "Rate 2" ), "hour2" => array( "size" => 3, "checkType" => 'numeric', "name" => "H1-H2" ), "rate_name3" => array( "size" => 12, "name" => "Rate 3" ), "hour3" => array( "size" => 3, "checkType" => 'numeric', "name" => "H2-H3" ), "rate_name4" => array( "size" => 12, "name" => "Rate 4" ), "hour4" => array( "size" => 3, "checkType" => 'numeric', "name" => "H3-24" ), ) ), "billing_rates" => array( "name" => "Rates", "keys" => array("id"), "size" => 10, "exceptions" => array('maxPrice'), "order" => "durationRate desc", "fields" => array( "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller" ), "name" => array( "size" => 12, "name" => "Rate", "class" => "span2" ), "destination" => array( "size" => 12, "name" => "Destination" ), "application" => array( "size" => 6, "name" => "App" ), "connectCost" => array( "size" => 8, "checkType" => 'numeric', "name"=>"Connect" ), "durationRate" => array( "size" => 8, "checkType" => 'numeric', "name" => "Duration" ), "connectCostIn" => array( "size" => 8, "checkType" => 'numeric', "name" => "Conn In" ), "durationRateIn" => array( "size" => 8, "checkType" => 'numeric', "name" => "Duration In" ) ) ), "billing_rates_history" => array( "name" => "Rates history", "keys" => array("id"), "size" => 10, "order" => "destination ASC, name ASC", "fields" => array( "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller" ), "name" => array( "size" => 10, "name" => "Rate", "class" => "span2" ), "destination" => array( "size" => 12, "name" => "Destination" ), "application" => array( "size" => 6, "name" => "App" ), "connectCost" => array( "size" => 8, "checkType" => 'numeric', "name" => "Conn" ), "durationRate" => array( "size" => 8, "checkType" => 'numeric', "name" => "Price" ), "connectCostIn" => array( "size" => 8, "checkType" => 'numeric', "name" => "Conn In" ), "durationRateIn" => array( "size" => 8, "checkType" => 'numeric', "name" => "Price In" ), "startDate" => array( "size" => 11, "name" => "Start Date", "class" => "span2" ), "endDate" => array( "size" => 11, "name" => "End Date", "class" => "span2" ) ) ), "billing_enum_tlds" => array( "name" => "ENUM discounts", "skip_math" => true, "keys" => array("id"), "exceptions" => array(), "size" => 6, "fields" => array( "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller" ), "enum_tld" => array( "size" => 35, "mustExist" => true, "checkType" => 'domain', "name" => "ENUM TLD", "class" => "span2" ), "e164_regexp" => array( "size" => 35, "mustExist" => true, "name" => "E164 Regexp", "class" => "span2" ), "discount" => array( "size" => 10, "mustExist" => true, "checkType" => 'numeric', "name" => "Discount" ) ) ), "prepaid" => array( "name" => "Prepaid accounts", "keys" => array("id"), "size" => 15, "exceptions" => array('change_date','active_sessions','domain'), "order" => "change_date DESC", "fields" => array( "account" => array( "size" => 35, "name" => "Subscriber", "checkType" => 'sip_account', "mustExist" => true, "class" => "span2" ), "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller" ), "balance" => array( "size" => 10, "name" => "Balance" ), "change_date" => array( "size" => 19, "name" => "Last Change", "readonly" => 1 ), "session_counter" => array( "size" => 3, "name" => "Active Sessions", "readonly" => 1 ), "max_sessions" => array( "size" => 3, "name" => "Max Sessions" ) ) ), "prepaid_cards" => array( "name" => "Prepaid cards", "keys" => array("id"), "size" => 15, "exceptions" => array('service'), "fields" => array( "batch" => array( "size" => 40, "name" => "Batch name", "readonly" => 1, "class" => "span3" ), "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller" ), "date_batch" => array( "size" => 11, "name" => "Batch Date", "class" => "span2" ), "number" => array( "size" => 20, "checkType" => 'numeric', "mustExist" => true, "name" => "Card Number", "class" => "span2" ), "id" => array( "size" => 20, "checkType" => 'numeric', "mustExist" => true, "name" => "Card Id", ), "value" => array( "size" => 8, "checkType" => 'numeric', "mustExist" => true, "name" => "Card Value" ), "blocked" => array( "size" => 1, "name" => "Lock" ), "date_active" => array( "size" => 18, "name" => "Activation Date", "class" => "span2" ) ) ), "prepaid_history" => array( "name" => "Prepaid history", "order" => "id DESC", "skip_math" => true, "keys" => array("id"), "size" => 15, "exceptions" => array('session','destination'), "fields" => array( "username" => array( "size" => 15, "readonly" => 1, "class" => "span2" ), "domain" => array( "size" => 15, "readonly" => 1, "class" => "span2" ), "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller", "readonly" => 1 ), "action" => array( "size" => 15, "readonly" => 1, "class" => "span2" ), "duration" => array( "size" => 5 ), "destination" => array( "size" => 15 ), "session" => array( "size" => 30, "readonly" => 1 ), "description" => array( "size" => 30, "class" => "span3" ), "value" => array( "size" => 10 ), "balance" => array( "size" => 10 ), "date" => array( "size" => 18, "class" => "span2" ) ) ), "quota_usage" => array( "name" => "Quota usage", "keys" => array("id"), "size" => 15, "readonly" => 1, "exceptions" => array( "change_date", "traffic", "duration", "calls" ), "domainFilterColumn" => "domain", "fields" => array( "datasource" => array( "size" => 15, "readonly" => 1 ), "reseller_id" => array( "size" => 8, "checkType" => 'numeric', "name" => "Reseller", "readonly" => true ), "account" => array( "size" => 30, "readonly" => 1, "name" => "Subscriber", "class" => "span2" ), "domain" => array( "size" => 15, "readonly" => 1, "class" => "span2" ), "blocked" => array( "size" => 2, "readonly" => 1 ), "notified" => array( "size" => 20, "readonly" => 1 ), "quota" => array( "size" => 5, "readonly" => 1 ), "cost" => array( "size" => 10, "readonly" => 1, "name" => "This Month" ), "cost_today" => array( "size" => 10, "readonly" => 1, "name" => "Today" ), "duration" => array( "size" => 10, "readonly" => 1 ), "calls" => array( "size" => 10, "readonly" => 1 ), "traffic" => array( "size" => 20, "readonly" => 1 ) ) ) ); public function RatingTables($readonly = false) { global $CDRTool; global $RatingEngine; $this->settings = $RatingEngine; $this->CDRTool = $CDRTool; $this->table = $_REQUEST['table']; if (!$this->table || !in_array($this->table, array_keys($this->tables))) { $this->table="destinations"; } $this->readonly=$readonly; if ($this->settings['csv_delimiter']) { $this->delimiter=$this->settings['csv_delimiter']; } if (!strlen($this->CDRTool['filter']['customer'])) { $this->whereResellerFilter = sprintf("reseller_id = %d", '99999999'); } else { if ($this->CDRTool['filter']['customer'] && $this->tables[$this->table]['fields']['reseller_id']) { $this->whereResellerFilter = sprintf("reseller_id = %d", addslashes($this->CDRTool['filter']['customer'])); $this->tables[$this->table]['fields']['reseller_id']['readonly']=true; } } if ($this->settings['split_rating_table']) { $this->tables['billing_rates']['fields']['name']['readonly'] = 1; } if (strlen($this->settings['socketIP'])) { if ($this->settings['socketIP'] == '0.0.0.0' || $this->settings['socketIP'] == '0') { $this->settings['socketIPforClients'] = '127.0.0.1'; } else { $this->settings['socketIPforClients'] = $this->settings['socketIP']; } } if ($this->settings['database_backend']) { $this->database_backend = $this->settings['database_backend']; } $this->db = new DB_cdrtool; $this->db1 = new DB_cdrtool; $this->db->Halt_On_Error="no"; $this->db1->Halt_On_Error="no"; } public function ImportCSVFiles($dir = false) { $results = 0; if (!$dir) $dir = "/var/spool/cdrtool"; $this->scanFilesForImport($dir); if ($this->previously_imported_files) { printf("Skipping %d previously imported files\n", $this->previously_imported_files); } $results=0; foreach (array_keys($this->filesToImport) as $file) { $importFunction = "Import".ucfirst($this->filesToImport[$file]['type']); printf("Reading file %s\n", $this->filesToImport[$file]['path']); $results = $this->$importFunction($this->filesToImport[$file]['path'],$this->filesToImport[$file]['reseller']); $this->logImport( $dir, $this->filesToImport[$file]['path'], $this->filesToImport[$file]['watermark'], $results, $this->filesToImport[$file]['reseller'] ); } return $results; } private function ImportRates($file, $reseller = 0) { if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false; $i=0; $inserted = 0; $updated = 0; $deleted = 0; printf("Importing rates from %s for reseller %s:\n", $file, $reseller); while ($buffer = fgets($fp, 1024)) { $buffer = trim($buffer); $p = explode($this->delimiter, $buffer); $ops = trim($p[0]); $name = trim($p[2]); $destination = trim($p[3]); $application = trim($p[4]); $connectCost = trim($p[5]); $durationRate = trim($p[6]); $connectCostIn = trim($p[7]); $durationRateIn = trim($p[8]); if ($reseller) { $reseller_id = intval($reseller); } else { $reseller_id = intval($p[1]); } if (!is_numeric($destination) && !strstr($destination, '@')) { // skip invalid destinations $skipped++; continue; } if (strlen($connectCost) && !is_numeric($connectCost)) { $skipped++; continue; } if (strlen($durationRate) && !is_numeric($durationRate)) { $skipped++; continue; } if (!$application) $application='audio'; if ($ops=="1") { $query = sprintf( "insert into billing_rates ( reseller_id, name, destination, application, connectCost, durationRate, connectCostIn, durationRateIn ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($name), addslashes($destination), addslashes($application), addslashes($connectCost), addslashes($durationRate), addslashes($connectCostIn), addslashes($durationRateIn) ); // mysql backend if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); } if ($this->db->affected_rows()) { if ($this->settings['split_rating_table']) { if ($name) { $_table = 'billing_rates_'.$name; } else { $_table = 'billing_rates_default'; } if (!$this->createRatingTable($name)) { $query = sprintf( "insert into %s ( id, reseller_id, name, destination, application, connectCost, durationRate, connectCostIn, durationRateIn ) values ( LAST_INSERT_ID(), '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($_table), addslashes($reseller_id), addslashes($name), addslashes($destination), addslashes($application), addslashes($connectCost), addslashes($durationRate), addslashes($connectCostIn), addslashes($durationRateIn) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } } } $inserted++; } else { $failed++; } } elseif ($ops == "3") { $query = sprintf( "delete from billing_rates where reseller_id = '%s' and name = '%s' and destination = '%s' and application = '%s'", addslashes($reseller_id), addslashes($name), addslashes($destination), addslashes($application) ); // mysql backend if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows()) { if ($this->settings['split_rating_table']) { if ($name) { $_table = 'billing_rates_'.$name; } else { $_table = 'billing_rates_default'; } $query = sprintf( "delete from %s where reseller_id = '%s' and name = '%s' and destination = '%s' and application = '%s'", addslashes($_table), addslashes($reseller_id), addslashes($name), addslashes($destination), addslashes($application) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); } } $deleted++; } // mysql backend if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->num_rows()) { $query = sprintf( "update billing_rates set connectCost = '%s', durationRate = '%s', connectCostIn = '%s', durationRateIn = '%s' where name = '%s' and destination = '%s' and reseller_id = '%s' and application = '%s' ", addslashes($connectCost), addslashes($durationRate), addslashes($connectCostIn), addslashes($durationRateIn), addslashes($name), addslashes($destination), addslashes($reseller_id), addslashes($application) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows()) { if ($this->settings['split_rating_table']) { if ($name) { $_table = 'billing_rates_'.$name; } else { $_table = 'billing_rates_default'; } $query = sprintf( "update %s set connectCost = '%s', durationRate = '%s', connectCostIn = '%s', durationRateIn = '%s' where name = '%s' and destination = '%s' and reseller_id = '%s' and application = '%s' ", addslashes($_table), addslashes($connectCost), addslashes($durationRate), addslashes($connectCostIn), addslashes($durationRateIn), addslashes($name), addslashes($destination), addslashes($reseller_id), addslashes($application) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); } } $updated++; } } else { $query = sprintf( "insert into billing_rates ( reseller_id, name, destination, application, connectCost, durationRate, connectCostIn, durationRateIn ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($name), addslashes($destination), addslashes($application), addslashes($connectCost), addslashes($durationRate), addslashes($connectCostIn), addslashes($durationRateIn) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows()) { if ($this->settings['split_rating_table']) { if ($name) { $_table = 'billing_rates_'.$name; } else { $_table = 'billing_rates_default'; } if (!$this->createRatingTable($name)) { $query = sprintf( "insert into %s ( id, reseller_id, name, destination, application connectCost, durationRate, connectCostIn, durationRateIn ) values ( LAST_INSERT_ID(), '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($_table), addslashes($reseller_id), addslashes($name), addslashes($destination), addslashes($application), addslashes($connectCost), addslashes($durationRate), addslashes($connectCostIn), addslashes($durationRateIn) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } } } $inserted++; } else { $failed++; } } } else { $skipped++; } $this->showImportProgress($file); $i++; } if ($i) print "Read $i records\n"; if ($skipped) print "Skipped $skipped records\n"; if ($inserted) print "Inserted $inserted records\n"; if ($updated) print "Updated $updated records\n"; if ($deleted) print "Delete $deleted records\n"; $results = $inserted+$updated+$deleted; return $results; } private function ImportRatesHistory($file, $reseller = 0) { if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false; $this->mustReload=true; $i=0; $inserted = 0; $updated = 0; $deleted = 0; printf("Importing rates history from %s for reseller %s:\n", $file, $reseller); while ($buffer = fgets($fp, 1024)) { $buffer=trim($buffer); $p = explode($this->delimiter, $buffer); $ops = trim($p[0]); $name = trim($p[2]); $destination = trim($p[3]); $application = trim($p[4]); $connectCost = trim($p[5]); $durationRate = trim($p[6]); $connectCostIn = trim($p[7]); $durationRateIn = trim($p[8]); $startDate = trim($p[9]); $endDate = trim($p[10]); if ($reseller) { $reseller_id = intval($reseller); } else { $reseller_id = intval($p[1]); } if (!is_numeric($destination) && !strstr($destination, '@')) { // skip invalid destinations $skipped++; continue; } if (strlen($connectCost) && !is_numeric($connectCost)) { $skipped++; continue; } if (strlen($durationRate) && !is_numeric($durationRate)) { $skipped++; continue; } if (preg_match("/^\d{4}\-{\d{2}\-\d{2}$/", $startDate)) { $skipped++; continue; } if (preg_match("/^\d{4}\-{\d{2}\-\d{2}$/", $endDate)) { $skipped++; continue; } if ($ops=="1") { $query = sprintf( "insert into billing_rates_history ( reseller_id, name, destination, application, connectCost, durationRate, connectCostIn, durationRateIn, startDate, endDate ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($name), addslashes($destination), addslashes($application), addslashes($connectCost), addslashes($durationRate), addslashes($connectCostIn), addslashes($durationRateIn), addslashes($startDate), addslashes($endDate) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $inserted++; } else { $failed++; } } elseif ($ops=="3") { $query = sprintf( "delete from billing_rates_history where reseller_id = '%s' and name = '%s' and destination = '%s' and startDate = '%s' and endDate = '%s'", addslashes($reseller_id), addslashes($name), addslashes($destination), addslashes($startDate), addslashes($endDate) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $deleted++; } } elseif ($ops=="2") { $query = sprintf( "select * from billing_rates_history where name = '%s' and destination = '%s' and reseller_id = '%s' and startDate = '%s' and endDate = '%s' ", addslashes($name), addslashes($destination), addslashes($reseller_id), addslashes($startDate), addslashes($endDate) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->num_rows()) { $query = sprintf( "update billing_rates_history set application = '%s', connectCost = '%s', durationRate = '%s', connectCostIn = '%s', connectCostIn = '%s' where name = '%s' and destination = '%s' and reseller_id = '%s' and startDate = '%s' and endDate = '%s' ", addslashes($application), addslashes($connectCost), addslashes($durationRate), addslashes($connectCostIn), addslashes($durationRateIn), addslashes($name), addslashes($destination), addslashes($reseller_id), addslashes($startDate), addslashes($endDate) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $updated++; } } else { $query = sprintf( "insert into billing_rates_history ( reseller_id, name, destination, application, connectCost, durationRate, connectCostIn, durationRateIn, startDate, endDate ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($name), addslashes($destination), addslashes($application), addslashes($connectCost), addslashes($durationRate), addslashes($connectCostIn), addslashes($durationRateIn), addslashes($startDate), addslashes($endDate) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $inserted++; } else { $failed++; } } } else { $skipped++; } $j++; if ($j=="10000") { flush(); $j=0; } $this->showImportProgress($file); $i++; } if ($i) print "Read $i records\n"; if ($skipped) print "Skipped $skipped records\n"; if ($inserted) print "Inserted $inserted records\n"; if ($updated) print "Updated $updated records\n"; if ($deleted) print "Delete $deleted records\n"; $results = $inserted + $updated + $deleted; return $results; } private function ImportCustomers($file, $reseller = 0) { if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false; $this->mustReload = true; $i=0; $inserted = 0; $updated = 0; $deleted = 0; printf("Importing customers from %s for reseller %s:\n", $file, $reseller); while ($buffer = fgets($fp, 1024)) { $buffer=trim($buffer); $p = explode($this->delimiter, $buffer); $ops = trim($p[0]); $gateway = trim($p[2]); $domain = trim($p[3]); $subscriber = trim($p[4]); $profile_name1 = trim($p[5]); $profile_name1_alt = trim($p[6]); $profile_name2 = trim($p[7]); $profile_name2_alt = trim($p[8]); $timezone = trim($p[9]); if ($reseller) { $reseller_id = intval($reseller); } else { $reseller_id = intval($p[1]); } if (strlen($reseller_id) && !is_integer($reseller_id)) { $skipped++; continue; } if ($ops=="1") { $query = sprintf( "insert into billing_customers ( reseller_id, gateway, domain, subscriber, profile_name1, profile_name2, timezone, profile_name1_alt, profile_name2_alt ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($gateway), addslashes($domain), addslashes($subscriber), addslashes($profile_name1), addslashes($profile_name2), addslashes($timezone), addslashes($profile_name1_alt), addslashes($profile_name2_alt) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $inserted++; } else { $failed++; } } elseif ($ops == "3") { $query = sprintf( "delete from billing_customers where gateway = '%s' and reseller_id = '%s' and domain = '%s' and subscriber = '%s' ", addslashes($gateway), addslashes($reseller_id), addslashes($domain), addslashes($subscriber) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $deleted++; } } elseif ($ops == "2") { $query = sprintf( "select * from billing_customers where gateway = '%s' and reseller_id = '%s' and domain = '%s' and subscriber = '%s' ", addslashes($gateway), addslashes($reseller_id), addslashes($domain), addslashes($subscriber) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->num_rows()) { $query = sprintf( "update billing_customers set profile_name1 = '%s', profile_name2 = '%s', profile_name1_alt = '%s', profile_name2_alt = '%s', timezone = '%s' where gateway = '%s' and domain = '%s' and reseller_id = '%s' and subscriber = '%s'\n", addslashes($profile_name1), addslashes($profile_name2), addslashes($profile_name1_alt), addslashes($profile_name2_alt), addslashes($timezone), addslashes($gateway), addslashes($domain), addslashes($reseller_id), addslashes($subscriber) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows()) { $updated++; } } else { $query = sprintf( "insert into billing_customers ( reseller_id, gateway, domain, subscriber, profile_name1, profile_name2, timezone, profile_name1_alt, profile_name2_alt ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($gateway), addslashes($domain), addslashes($subscriber), addslashes($profile_name1), addslashes($profile_name2), addslashes($timezone), addslashes($profile_name1_alt), addslashes($profile_name2_alt) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows()) { $inserted++; } } } else { $skipped++; } $this->showImportProgress($file); $i++; } if ($i) print "Read $i records\n"; if ($skipped) print "Skipped $skipped records\n"; if ($inserted) print "Inserted $inserted records\n"; if ($updated) print "Updated $updated records\n"; if ($deleted) print "Delete $deleted records\n"; $results=$inserted+$updated+$deleted; return $results; } private function ImportDestinations($file, $reseller = 0) { if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false; $this->mustReload=true; $i=0; $inserted = 0; $updated = 0; $deleted = 0; printf("Importing destinations from %s for reseller %s:\n", $file, $reseller); while ($buffer = fgets($fp, 1024)) { $buffer=trim($buffer); $p = explode($this->delimiter, $buffer); $ops = trim($p[0]); $gateway = trim($p[2]); $domain = trim($p[3]); $subscriber = trim($p[4]); $dest_id = trim($p[5]); $region = trim($p[6]); $dest_name = trim($p[7]); $increment = intval($p[8]); $min_duration = intval($p[9]); $max_duration = intval($p[10]); $max_price = trim($p[11]); if ($reseller) { $reseller_id = intval($reseller); } else { $reseller_id = intval($p[1]); } if (!is_numeric($dest_id) && !strstr($dest_id, '@')) { // skip invalid destinations $skipped++; continue; } if ($ops=="1") { $query = sprintf( "insert into destinations ( reseller_id, gateway, domain, subscriber, dest_id, region, dest_name, increment, min_duration, max_duration, max_price ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($gateway), addslashes($domain), addslashes($subscriber), addslashes($dest_id), addslashes($region), addslashes($dest_name), addslashes($increment), addslashes($min_duration), addslashes($max_duration), addslashes($max_price) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $inserted++; } else { $failed++; } } elseif ($ops == "3") { $query = sprintf( "delete from destinations where gateway = '%s' and reseller_id = '%s' and domain = '%s' and subscriber = '%s' and dest_id = '%s' ", addslashes($gateway), addslashes($reseller_id), addslashes($domain), addslashes($subscriber), addslashes($dest_id) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $deleted++; } } elseif ($ops == "2") { $query = sprintf( "select * from destinations where gateway = '%s' and reseller_id = '%s' and domain = '%s' and subscriber = '%s' and dest_id = '%s' ", addslashes($gateway), addslashes($reseller_id), addslashes($domain), addslashes($subscriber), addslashes($dest_id) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->num_rows()) { $query = sprintf( "update destinations set region = '%s', dest_name = '%s', increment = '%s', min_duration = '%s', max_duration = '%s', max_price = '%s' where gateway = '%s' and reseller_id = '%s' and domain = '%s' and subscriber = '%s' and dest_id = '%s' ", addslashes($region), addslashes($dest_name), addslashes($increment), addslashes($min_duration), addslashes($max_duration), addslashes($max_price), addslashes($gateway), addslashes($reseller_id), addslashes($domain), addslashes($subscriber), addslashes($dest_id) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows()) { $updated++; } } else { $query = sprintf( "insert into destinations ( reseller_id, gateway, domain, subscriber, dest_id, region, dest_name, increment, min_duration, max_duration, max_price ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($gateway), addslashes($domain), addslashes($subscriber), addslashes($dest_id), addslashes($region), addslashes($dest_name), addslashes($increment), addslashes($min_duration), addslashes($max_duration), addslashes($max_price) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $inserted++; } else { $failed++; } } } else { $skipped++; } $this->showImportProgress($file); $i++; } if ($i) print "Read $i records\n"; if ($skipped) print "Skipped $skipped records\n"; if ($inserted) print "Inserted $inserted records\n"; if ($updated) print "Updated $updated records\n"; if ($deleted) print "Delete $deleted records\n"; $results = $inserted + $updated + $deleted; return $results; } private function ImportDiscounts($file, $reseller = 0) { if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false; $this->mustReload=true; $i=0; $inserted = 0; $updated = 0; $deleted = 0; printf("Importing discounts from %s for reseller %s:\n", $file, $reseller); while ($buffer = fgets($fp, 1024)) { $buffer=trim($buffer); $p = explode($this->delimiter, $buffer); $ops = trim($p[0]); $gateway = trim($p[2]); $domain = trim($p[3]); $subscriber = trim($p[4]); $application = trim($p[5]); $destination = trim($p[6]); $region = trim($p[7]); $connect = intval($p[8]); $duration = intval($p[9]); if ($reseller) { $reseller_id = intval($reseller); } else { $reseller_id = intval($p[1]); } if (!is_numeric($destination) && !strstr($destination, '@')) { // skip invalid destinations $skipped++; continue; } if ($ops == "1") { $query = sprintf( "insert into billing_discounts ( reseller_id, gateway, domain, subscriber, application, destination, region, connect, duration ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($gateway), addslashes($domain), addslashes($subscriber), addslashes($application), addslashes($destination), addslashes($region), addslashes($connect), addslashes($duration) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $inserted++; } else { $failed++; } } elseif ($ops == "3") { $query=sprintf( "delete from billing_discounts where gateway = '%s' and reseller_id = '%s' and domain = '%s' and subscriber = '%s' and application = '%s' and destination = '%s' and region = '%s' ", addslashes($gateway), addslashes($reseller_id), addslashes($domain), addslashes($subscriber), addslashes($application), addslashes($destination), addslashes($region) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $deleted++; } } elseif ($ops == "2") { $query = sprintf( "select * from billing_discounts where gateway = '%s' and reseller_id = '%s' and domain = '%s' and subscriber = '%s' and application = '%s' and destination = '%s' and region = '%s' ", addslashes($gateway), addslashes($reseller_id), addslashes($domain), addslashes($subscriber), addslashes($application), addslashes($destination), addslashes($region) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->num_rows()) { $query = sprintf( "update billing_discounts set connect = '%s', duration = '%s', where gateway = '%s' and reseller_id = '%s' and domain = '%s' and subscriber = '%s' and application = '%s' and destination = '%s' and region = '%s' ", addslashes($connect), addslashes($duration), addslashes($gateway), addslashes($reseller_id), addslashes($domain), addslashes($subscriber), addslashes($application), addslashes($destination), addslashes($region) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows()) { $updated++; } } else { $query = sprintf( "insert into billing_discounts ( reseller_id, gateway, domain, subscriber, application, destination, region, connect, duration ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($gateway), addslashes($domain), addslashes($subscriber), addslashes($application), addslashes($destination), addslashes($region), addslashes($connect), addslashes($duration) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $inserted++; } else { $failed++; } } } else { $skipped++; } $this->showImportProgress($file); $i++; } if ($i) print "Read $i records\n"; if ($skipped) print "Skipped $skipped records\n"; if ($inserted) print "Inserted $inserted records\n"; if ($updated) print "Updated $updated records\n"; if ($deleted) print "Delete $deleted records\n"; $results = $inserted + $updated + $deleted; return $results; } private function ImportProfiles($file, $reseller = 0) { if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false; $this->mustReload=true; $i=0; $inserted = 0; $updated = 0; $deleted = 0; print "Importing Profiles:\n"; while ($buffer = fgets($fp, 1024)) { $buffer=trim($buffer); $p = explode($this->delimiter, $buffer); $ops = trim($p[0]); $profile = trim($p[2]); $rate1 = trim($p[3]); $hour1 = trim($p[4]); $rate2 = trim($p[5]); $hour2 = trim($p[6]); $rate3 = trim($p[7]); $hour3 = trim($p[8]); $rate4 = trim($p[9]); $hour4 = trim($p[10]); if ($reseller) { $reseller_id = intval($reseller); } else { $reseller_id = intval($p[1]); } if (!$hour1) $hour1=0; if (!$hour2) $hour2=0; if (!$hour3) $hour3=0; if (!$hour4) $hour4=0; if ($ops=="1") { $query = sprintf( "insert into billing_profiles ( reseller_id, name, rate_name1, hour1, rate_name2, hour2, rate_name3, hour3, rate_name4, hour4 ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($profile), addslashes($rate1), addslashes($hour1), addslashes($rate2), addslashes($hour2), addslashes($rate3), addslashes($hour3), addslashes($rate4), addslashes($hour4) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $inserted++; } else { $failed++; } } elseif ($ops == "3") { $query = sprintf( "delete from billing_profiles where name = '%s' and reseller_id= '%s' ", addslashes($profile), addslashes($reseller_id) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $deleted++; } } elseif ($ops == "2") { $query = sprintf( "select * from billing_profiles where name = '%s' and reseller_id= '%s' ", addslashes($profile), addslashes($reseller_id) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->num_rows()) { $query = sprintf( "update billing_profiles set rate_name1 = '%s', rate_name2 = '%s', rate_name3 = '%s', rate_name4 = '%s', hour1 = '%s', hour2 = '%s', hour3 = '%s', hour4 = '%s' where name = '%s' and reseller_id= '%s' \n", addslashes($rate1), addslashes($rate2), addslashes($rate3), addslashes($rate4), addslashes($hour1), addslashes($hour2), addslashes($hour3), addslashes($hour4), addslashes($profile), addslashes($reseller_id) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows()) { $updated++; } } else { $query = sprintf( "insert into billing_profiles ( reseller_id, name, rate_name1, hour1, rate_name2, hour2, rate_name3, hour3, rate_name4, hour4 ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", addslashes($reseller_id), addslashes($profile), addslashes($rate1), addslashes($hour1), addslashes($rate2), addslashes($hour2), addslashes($rate3), addslashes($hour3), addslashes($rate4), addslashes($hour4) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows() >0) { $inserted++; } else { $failed++; } } } $this->showImportProgress($file); $i++; } if ($i) print "Read $i records\n"; if ($inserted) print "Inserted $inserted records\n"; if ($updated) print "Updated $updated records\n"; if ($deleted) print "Delete $deleted records\n"; $results = $inserted + $updated + $deleted; return $results; } public function LoadRatingTables() { $log = sprintf( "Memory usage: %0.2fMB, memory limit: %sB", memory_get_usage() / 1024 / 1024, ini_get('memory_limit') ); syslog(LOG_NOTICE, $log); $loaded['profiles'] = $this->LoadProfilesTable(); $loaded['ratesHistory'] = $this->LoadRatesHistoryTable(); $loaded['holidays'] = $this->LoadHolidaysTable(); $loaded['enumTlds'] = $this->LoadENUMtldsTable(); foreach (array_keys($loaded) as $_load) { syslog(LOG_NOTICE, "Loaded $loaded[$_load] $_load into memory"); } $log = sprintf( "Memory usage: %0.2fMB, memory limit: %sB", memory_get_usage() / 1024 / 1024, ini_get('memory_limit') ); syslog(LOG_NOTICE, $log); return $loaded; } private function LoadENUMtldsTable() { $query = "select * from billing_enum_tlds"; if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $i=0; $rows=$this->db->num_rows(); while ($this->db->next_record()) { if ($this->db->Record['enum_tld']) { $i++; $_app=$this->db->Record['application']; if (!$_app) $_app='audio'; $_ENUMtlds[$this->db->Record['enum_tld']] = array( "discount" => $this->db->Record['discount'], "e164_regexp" => $this->db->Record['e164_regexp'] ); } } $this->ENUMtlds = $_ENUMtlds; $this->ENUMtldsCount = $i; return $i; } private function LoadRatesHistoryTable() { $query = "select *, UNIX_TIMESTAMP(startDate) as startDateTimestamp, UNIX_TIMESTAMP(endDate) as endDateTimestamp from billing_rates_history order by name ASC,destination ASC,startDate DESC"; if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $i=0; $rows=$this->db->num_rows(); while ($this->db->next_record()) { if ($this->db->Record['name'] && $this->db->Record['destination']) { $i++; $_app = $this->db->Record['application']; if (!$_app) $_app='audio'; $_rates[$this->db->Record['name']][$this->db->Record['destination']][$_app][$this->db->Record['id']]= array( "connectCost" => $this->db->Record['connectCost'], "durationRate" => $this->db->Record['durationRate'], "connectCostIn" => $this->db->Record['connectCostIn'], "durationRateIn" => $this->db->Record['durationRateIn'], "increment" => $this->db->Record['increment'], "min_duration" => $this->db->Record['min_duration'], "startDate" => $this->db->Record['startDateTimestamp'], "endDate" => $this->db->Record['endDateTimestamp'] ); } } $this->ratesHistory = $_rates; $this->ratesHistoryCount = $i; return $i; } private function LoadProfilesTable() { $query = "select * from billing_profiles order by name"; if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $i=0; while ($this->db->next_record()) { $i++; if ($this->db->Record['name'] && $this->db->Record['hour1'] > 0) { $_profiles[$this->db->Record['name']]= array( "rate_name1" => $this->db->Record['rate_name1'], "hour1" => $this->db->Record['hour1'], "rate_name2" => $this->db->Record['rate_name2'], "hour2" => $this->db->Record['hour2'], "rate_name3" => $this->db->Record['rate_name3'], "hour3" => $this->db->Record['hour3'], "rate_name4" => $this->db->Record['rate_name4'], "hour4" => $this->db->Record['hour4'], ); } } $this->profiles=$_profiles; return $i; } private function LoadHolidaysTable() { $query="select * from billing_holidays order by day"; if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $i=0; while ($this->db->next_record()) { if ($this->db->Record['day']) { $i++; $_holidays[$this->db->Record['day']]++; } } $this->holidays=$_holidays; return $i; } public function checkRatingEngineConnection() { if ($this->settings['socketIPforClients'] && $this->settings['socketPort'] && $fp = fsockopen($this->settings['socketIPforClients'], $this->settings['socketPort'], $errno, $errstr, 2) ) { fclose($fp); return true; } return false; } function showCustomers($filter) { return true; foreach (array_keys($this->customers) as $key) { if (strlen($filter)) { if (preg_match("/$filter/", $key)) { $customers = $customers.$key."\n"; } } else { $customers = $customers.$key."\n"; } } return $customers; } public function showProfiles() { foreach (array_keys($this->profiles) as $key) { $profiles=$profiles.$key."\n"; } return $profiles; } public function showENUMtlds() { foreach (array_keys($this->ENUMtlds) as $key) { $ENUMtlds=$ENUMtlds.$key."\n"; } return $ENUMtlds; } private function scanFilesForImport($dir) { $import_dirs[$this->cvs_import_dir] = array( 'path' => $this->cvs_import_dir, 'reseller' => 0 ); if ($handle = opendir($this->cvs_import_dir)) { while (false !== ($filename = readdir($handle))) { $reseller=0; if ($filename == "." || $filename == "..") continue; $fullPath = $this->cvs_import_dir."/".$filename; if (is_dir($fullPath) && is_numeric($filename)) { $reseller = $filename; $import_dirs[$fullPath]=array( 'path' => $fullPath, 'reseller'=> $reseller ); } } } foreach (array_keys($import_dirs) as $_dir) { if ($handle = opendir($_dir)) { while (false !== ($filename = readdir($handle))) { if ($filename != "." && $filename != "..") { foreach ($this->importFilesPatterns as $_pattern) { if (strstr($filename, $_pattern) && preg_match("/\.csv$/", $filename)) { $fullPath = $_dir."/".$filename; if ($content = file_get_contents($fullPath)) { $watermark = $filename."-".md5($content); if ($this->hasFileBeenImported($filename, $watermark)) { $this->previously_imported_files++; break; } $this->filesToImport[$filename] = array( 'name' => $filename, 'watermark' => $watermark, 'type' => $_pattern, 'path' => $fullPath, 'reseller' => $import_dirs[$_dir]['reseller'] ); } break; } } } } } } } private function hasFileBeenImported($filename, $watermark) { $query = sprintf( "select * from log where url = '%s'\n", addslashes($watermark) ); if ($this->db->query($query)) { if ($this->db->num_rows()) { $this->db->next_record(); /* $log=sprintf ("File %s has already been imported at %s.\n",$filename,$this->db->f('date')); syslog(LOG_NOTICE, $log); print $log; */ return true; } else { return false; } } else { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } } private function logImport($dir, $filename, $watermark, $results = 0, $reseller = 0) { $query = sprintf( "insert into log ( date, login, ip, url, results, description, datasource, reseller_id ) values ( NOW(), 'ImportScript', 'localhost', '%s', '%s', 'Imported %s', '%s', %d )", addslashes($watermark), addslashes($results), addslashes($filename), addslashes($dir), addslashes($reseller) ); $log = sprintf( "Imported file %s, %d records have been affected\n", $filename, $results ); syslog(LOG_NOTICE, $log); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } } function showImportProgress($filename = 'unspecified', $increment = 5000) { $this->importIndex++; if ($this->importIndex == $increment) { printf("Loaded %d records from %s\n", $this->importIndex, $filename); flush(); $this->importIndex=0; } } function createRatingTable($name) { if ($name) { $table='billing_rates_'.$name; } else { $table='billing_rates_default'; } $query = sprintf( "create table %s select * from billing_rates where name = '%s'\n", addslashes($table), addslashes($name) ); if ($this->db->query($query)) { $query = sprintf( "alter table %s add index rate_idx (name)", addslashes($table) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); } $query = sprintf( "alter table %s add index destination_idx (destination)", addslashes($table) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); } printf("Created table %s\n", $table); return true; } else { return false; } } public function splitRatingTable() { $query = "select count(*) as c from billing_rates"; if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $this->db->next_record(); $rows=$this->db->f('c'); $query="select distinct(name) from billing_rates order by name ASC"; if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } while ($this->db->next_record()) { $rate_names[]=$this->db->f('name'); } foreach ($rate_names as $name) { if (!$name) $name='default'; $table="billing_rates_".$name; $query = sprintf("drop table if exists %s", addslashes($table)); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $query = sprintf( "create table %s select * from billing_rates where name = '%s'\n", addslashes($table), addslashes($name) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } else { $query = sprintf( "alter table %s add index rate_idx (name)", addslashes($table) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $query = sprintf( "alter table %s add index destination_idx (destination)", addslashes($table) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $query = sprintf("select count(*) as c from %s", addslashes($table)); $this->db->query($query); $this->db->next_record(); $records=$this->db->f('c'); $created_records=$created_records+$records; $progress=100*$created_records/$rows; printf( "Created table %s with %s records (%.1f %s)\n", $table, $records, $progress, '%' ); } } return true; } public function updateTable() { global $auth; $loginname=$auth->auth["uname"]; foreach ($this->web_elements as $_el) { ${$_el}= $_REQUEST[$_el]; } if (!$table) return false; if ($this->readonly) { return true; } // Init table structure if (!is_array($this->tables[$table]['exceptions'])) $this->tables[$table]['exceptions']=array(); if (!is_array($this->tables[$table]['keys'])) $this->tables[$table]['keys']=array(); if (!is_array($this->tables[$table]['fields'])) $this->tables[$table]['fields']=array(); $metadata = $this->db->metadata($table = "$table"); $cc = count($metadata); // end init table structure if ($web_task =="update") { $affected_rows=0; if ($subweb_task == "Update") { if ($this->checkValues($table, $_REQUEST)) { $update_set=''; $k=0; while ($k < $cc) { $k++; $Fname=$metadata[$k]['name']; if (!$Fname) continue; $value=$_REQUEST[$Fname]; if ($this->tables[$table]['fields'][$Fname]['readonly']) { continue; } if (in_array($Fname, $this->tables[$table]['exceptions'])) { continue; } if (in_array($Fname, $this->tables[$table]['keys'])) { continue; } if ($kkk > 0) { $comma = ","; } else { $comma = ""; } if (!$this->tables[$table]['skip_math'] && preg_match("/^([\+\-\*\/])(.*)$/", $value, $sign)) { $update_set .= $comma.addslashes($Fname)."= ROUND(".addslashes($Fname). " ".$sign[1]. "'".$sign[2]."')"; } else { $update_set .= $comma.addslashes($Fname)."='".addslashes($value)."'"; } $kkk++; } $k=0; while ($k < $cc) { if ($metadata[$k]['name'] == 'change_date') { $update_set .= sprintf("%s %s = NOW() ", $comma, addslashes($metadata[$k]['name'])); break; } $k++; } $log_entity=" id = $id "; $where = sprintf(" id = '%s' and %s", addslashes($id), $this->whereResellerFilter); if ($table == "billing_rates") { if ($this->settings['split_rating_table']) { $rate_table_affected = array(); $query_r = "select distinct (name) from billing_rates where". $where; if ($this->db->query($query_r)) { while ($this->db->next_record()) { $rate_tables_affected[]='billing_rates_'.$this->db->f('name'); } } else { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); } } } elseif ($table=="prepaid") { register_shutdown_function("unLockTables", $this->db); if ($this->db->query("lock table prepaid write")) { $query_q = sprintf( "select * from prepaid where account = '%s'", addslashes($account) ); if ($this->db->query($query_q) && $this->db->num_rows()) { $this->db->next_record(); $old_balance=$this->db->f('balance'); } $this->db->query("unlock tables"); } } $query = sprintf( "update %s set %s where %s ", addslashes($table), $update_set, $where ); if ($this->db->query($query)) { $affected_rows=$this->db->affected_rows(); if ($affected_rows) { if ($table=="prepaid") { list($username, $domain) = explode("@", $account); $value=$balance-$old_balance; if (floatval($balance) != floatval($old_balance)) { $query = sprintf( "insert into prepaid_history (username,domain,action,description,value,balance,date,reseller_id) values ('%s','%s','Set balance','Manual update','%s','%s',NOW(),%d)", addslashes($username), addslashes($domain), addslashes($value), addslashes($balance), $this->CDRTool['filter']['reseller'] ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); } } } elseif ($table=='billing_rates') { if ($this->settings['split_rating_table']) { foreach ($rate_tables_affected as $extra_rate_table) { $query_u = sprintf( "update %s set %s where %s ", addslashes($extra_rate_table), $update_set, $where ); if (!$this->db->query($query_u)) { $log = sprintf( "Database error for query %s: %s (%s)", $query_u, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); } } } } if (in_array($table, $this->requireReload)) { if (!$this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'")) { printf( "Database error: %s (%s)", $this->db->Error, $this->db->Errno ); } } } } else { printf( "Database error for query '%s': %s (%s)", $query, $this->db->Error, $this->db->Errno ); } } else { print "

Correct the values and try again."; } } elseif ($subweb_task == "Update selection") { $k=0; $kkk=0; $update_set=''; while ($k < $cc) { $k++; $Fname=$metadata[$k]['name']; $value=$_REQUEST[$Fname]; if (!strlen($value)) continue; if ($this->tables[$table]['fields'][$Fname]['readonly']) { continue; } if (in_array($Fname, $this->tables[$table]['exceptions'])) { continue; } if (in_array($Fname, $this->tables[$table]['keys'])) { continue; } if ($kkk > 0) { $comma = ","; } else { $comma=""; } if ($value == "NULL") { $value=""; } if (preg_match("/^([\+\-\*\/])(.*)$/", $value, $sign)) { $update_set .= $comma.$Fname." = ROUND(".$Fname. " ".$sign[1]. "'".$sign[2]."')"; } else { $update_set .= $comma.$Fname." = '".$value."'"; } $kkk++; } $where = $this->whereResellerFilter; if ($kkk) { // reconstruct where clause to apply all changes to selection // build where clause // Search build for each field $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if (!in_array($Fname, $this->tables[$table]['exceptions'])) { $f_name="search_".$Fname; $value=$_REQUEST[$f_name]; if (preg_match("/^([<|>]+)(.*)$/", $value, $likes)) { $like=$likes[1]; $likewhat=$likes[2]; $quotes=""; } else { $like="like"; $likewhat=$value; $quotes="'"; } if (strlen($value)) { $where .= " and $Fname $like $quotes".$likewhat."$quotes"; $t++; } } $j++; } if ($table == 'billing_rates') { if ($this->settings['split_rating_table']) { $rate_table_affected = array(); $query_r = "select distinct (name) from billing_rates where". $where; if ($this->db->query($query_r)) { while ($this->db->next_record()) { $rate_tables_affected[] = 'billing_rates_'.$this->db->f('name'); } } else { printf( "Database error: %s (%s)", $this->db->Error, $this->db->Errno ); } } } $query = sprintf( "update %s set %s where %s ", addslashes($table), $update_set, $where ); if ($this->db->query($query)) { $affected_rows=$this->db->affected_rows(); if ($affected_rows) { if ($table == 'billing_rates') { if ($this->settings['split_rating_table']) { foreach ($rate_tables_affected as $extra_rate_table) { $query_u = sprintf( "update %s set %s where %s ", addslashes($extra_rate_table), $update_set, $where ); if (!$this->db->query($query_u)) { printf( "Database error for %s: %s (%s)", $query_u, $this->db->Error, $this->db->Errno ); } } } } if (in_array($table, $this->requireReload)) { $this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'"); } } } else { printf("Database error: %s", $this->db->Error); } } } elseif ($subweb_task == "Delete selection") { if ($confirmDelete) { // reconstruct where clause to apply all changes to selection // build where clause // Search build for each field $where = $this->whereResellerFilter; $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if (!in_array($Fname, $this->tables[$table]['exceptions'])) { $f_name="search_".$Fname; $value=$_REQUEST[$f_name]; if (preg_match("/^([<|>]+)(.*)$/", $value, $likes)) { $like = $likes[1]; $likewhat = $likes[2]; $quotes = ""; } else { $like = "like"; $likewhat = $value; $quotes = "'"; } if (strlen($value)) { $where .= " and $Fname $like $quotes".$likewhat."$quotes"; $t++; } } $j++; } if ($table == 'billing_rates') { if ($this->settings['split_rating_table']) { $rate_table_affected=array(); $query_r = "select distinct (name) from billing_rates where". $where; if ($this->db->query($query_r)) { while ($this->db->next_record()) { $rate_tables_affected[] = 'billing_rates_'.$this->db->f('name'); } } else { printf( "Database error: %s (%s)", $this->db->Error, $this->db->Errno ); } } } $query = sprintf( "delete from %s where %s", addslashes($table), $where ); if ($this->db->query($query)) { $affected_rows = $this->db->affected_rows(); if ($affected_rows) { if ($table == 'billing_rates') { if ($this->settings['split_rating_table']) { foreach ($rate_tables_affected as $extra_rate_table) { $query_u = sprintf( "delete from %s where %s ", addslashes($extra_rate_table), $where ); if (!$this->db->query($query_u)) { printf( "Database error for %s: %s (%s)", $query_u, $this->db->Error, $this->db->Errno ); } } } } if (in_array($table, $this->requireReload)) { $this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'"); } } } else { printf( "Database error: %s", $this->db->Error ); } unset($confirmDelete); } else { print "

"; print "Please confirm the deletion by pressing the Delete button again. "; print ""; print ""; } } elseif ($subweb_task == "Copy rate" && strlen($fromRate) && strlen($toRate)) { $toRate=preg_replace("/%/", "", $toRate); if ($confirmCopy) { if ($toRate == 'history') { $values = sprintf( "(reseller_id,name,destination,application,connectCost,durationRate,connectCostIn,durationRateIn,startDate,endDate) select billing_rates.reseller_id, '%s', billing_rates.destination, billing_rates.application, billing_rates.connectCost, billing_rates.durationRate, billing_rates.connectCostIn, billing_rates.durationRateIn, NOW(), NOW() from billing_rates ", addslashes($fromRate) ); } else { $values = sprintf( "(reseller_id,name,destination,application,connectCost,durationRate,connectCostIn,durationRateIn) select billing_rates.reseller_id, '%s', billing_rates.destination, billing_rates.application, billing_rates.connectCost, billing_rates.durationRate, billing_rates.connectCostIn, billing_rates.durationRateIn from billing_rates ", addslashes($toRate) ); } $where = $this->whereResellerFilter; $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if (!in_array($Fname, $this->tables[$table]['exceptions'])) { $f_name="search_".$Fname; $value=$_REQUEST[$f_name]; if (preg_match("/^([<|>]+)(.*)$/", $value, $likes)) { $like=$likes[1]; $likewhat=$likes[2]; $quotes=""; } else { $like="like"; $likewhat=$value; $quotes="'"; } if (strlen($value)) { $where .= sprintf( " and %s %s %s%s%s ", addslashes($Fname), $like, $quotes, addslashes($likewhat), $quotes ); $t++; } } $j++; } if ($toRate == 'history') { $query="insert into billing_rates_history $values where $where"; } else { $query="insert into billing_rates $values where $where"; } if ($this->db->query($query)) { $affected_rows=$this->db->affected_rows(); if ($affected_rows) { print "$affected_rows rates copied. "; if ($table == 'billing_rates') { if ($this->settings['split_rating_table']) { $query = sprintf( "create table billing_rates_%s select * from billing_rates where %s ", addslashes($toRate), $where ); if (!$this->db->query($query)) { printf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); } } } if (in_array($table, $this->requireReload)) { $this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'"); } } if ($toRate == 'history') { // Switch to history $table = 'billing_rates_history'; // Init table structure $this->tables[$table]['exceptions']= $this->tables[$table]['exceptions']; $this->tables[$table]['keys'] = $this->tables[$table]['keys']; $this->tables[$table]['fields'] = $this->tables[$table]['fields']; $metadata = $this->db->metadata($table = "$table"); $cc = count($metadata); // end init table structure } unset($confirmCopy); } else { printf("Database error: %s", $this->db->Error); } $log_entity="rate=$toRate"; } else { print "

"; print "Please confirm the copy of rate $fromRate to $toRate. "; print ""; } } elseif ($subweb_task == "Insert") { //print "

Insert

"; if ($this->checkValues($table, $_REQUEST)) { $query=sprintf("insert into %s ( ", addslashes($table)); $k=1; $kkk=0; while ($k < $cc) { $Fname=$metadata[$k]['name']; if (!in_array($Fname, $this->tables[$table]['exceptions'])) { if ($kkk > 0) { $comma = ","; } else { $comma=""; } $query .= $comma.addslashes($Fname); $kkk++; } $k++; } $query .= ") values ( "; $k=1; $kkk=0; while ($k < $cc) { $Fname=$metadata[$k]['name']; $value=$_REQUEST[$Fname]; if (!in_array($Fname, $this->tables[$table]['exceptions'])) { if ($kkk > 0) { $comma = ","; } else { $comma=""; } if ($Fname == 'reseller_id' && $this->CDRTool['filter']['reseller']) { $query .= $comma."'".addslashes($this->CDRTool['filter']['reseller'])."'"; } else { $query .= $comma."'".addslashes($value)."'"; } $kkk++; } $k++; } $query .= ") "; $k=1; while ($k < $cc) { $Fname=$metadata[$k]['name']; $value=$_REQUEST[$Fname]; if (in_array($Fname, $this->tables[$table]['keys'])) { if ($value == "") { $Fname_print_insert = substr($Fname, 4); print "$Fname_print_insert = ????
"; $empty_insert = 1; } } $k++; } if (!$empty_insert) { if ($this->db->query($query)) { $affected_rows=$this->db->affected_rows(); if ($affected_rows) { $this->db->query("select LAST_INSERT_ID() as lid"); $this->db->next_record(); $log_entity = sprintf("id=%s", $this->db->f('lid')); if (in_array($table, $this->requireReload)) { $this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'"); } } } else { printf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); } } else { print " Error: The insert statement contains an empty key! "; } } else { print "

Correct the values and try again."; } } elseif ($subweb_task == "Delete") { if ($confirmDelete) { $query = sprintf( "delete from %s where id = '%s' and %s ", addslashes($table), addslashes($id), addslashes($this->whereResellerFilter) ); if ($this->db->query($query)) { $affected_rows=$this->db->affected_rows(); if ($affected_rows && in_array($table, $this->requireReload)) { $this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'"); } $log_entity = sprintf("id=%s", $id); } else { printf("Database error: %s", $this->db->Error); } unset($confirmDelete); } else { $idForDeletion=$id; print "

"; print "Please confirm the deletion by pressing the Delete button again. "; print ""; print ""; } } elseif ($subweb_task == "Delete session" && $sessionId && $table=='prepaid') { $query = sprintf( "select active_sessions from %s where id = %d and %s", addslashes($table), addslashes($id), $this->whereResellerFilter ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; } if (!$this->db->num_rows()) return; $this->db->next_record(); if (strlen($this->db->f('active_sessions'))) { // remove session $active_sessions=array(); $old_active_sessions = json_decode($this->db->f('active_sessions'), true); if (!count($old_active_sessions)) return; foreach (array_keys($old_active_sessions) as $_key) { if ($_key==$sessionId) continue; $active_sessions[$_key]=$old_active_sessions[$_key]; } } else { $active_sessions=array(); } $query = sprintf( "update %s set active_sessions = '%s', session_counter = %d where id = %d", addslashes($table), addslashes(json_encode($active_sessions)), count($active_sessions), addslashes($id) ); if ($this->db->query($query)) { return 1; } else { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); print $log; return 0; } } if ($affected_rows && $table!="prepaid") { $log_query = sprintf( "insert into log (date,login,ip,datasource,results,description,reseller_id) values (NOW(),'%s','%s','Rating','%d','%s in table %s %s',%d)", addslashes($loginname), addslashes($_SERVER['REMOTE_ADDR']), addslashes($affected_rows), addslashes($subweb_task), addslashes($table), addslashes($log_entity), addslashes($this->CDRTool['filter']['reseller']) ); $this->db->query($log_query); } } } public function showTable() { $PHP_SELF=$_SERVER['PHP_SELF']; foreach ($this->web_elements as $_el) { ${$_el}= $_REQUEST[$_el]; } if ($this->table == 'prepaid_cards') { print "

Prepaid card generator"; } // Init table structure if (!is_array($this->tables[$this->table]['exceptions'])) $this->tables[$this->table]['exceptions']=array(); if (!is_array($this->tables[$this->table]['keys'])) $this->tables[$this->table]['keys']=array(); if (!is_array($this->tables[$this->table]['fields'])) $this->tables[$this->table]['fields']=array(); if ($this->table=='prepaid' && strlen($_REQUEST['search_session_counter'])) { $this->readonly=true; } if ($this->readonly) { $this->tables[$this->table]['readonly']=1; } $metadata = $this->db->metadata($this->table); $cc = count($metadata); // end init table structure // // delimiter for exporting records if ($this->settings['csv_delimiter']) { $delimiter=$this->settings['csv_delimiter']; } else { $delimiter=","; } $query = sprintf( "select count(*) as c from %s where %s", addslashes($this->table), $this->whereResellerFilter ); $t=0; $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; $class=$metadata[$j]['class']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { $f_name="search_".$Fname; $value=$_REQUEST[$f_name]; if (preg_match("/^([<|>]+)(.*)$/", $value, $likes)) { $like=$likes[1]; $likewhat=$likes[2]; $quotes=""; } else { $like="like"; $likewhat=$value; $quotes="'"; } if (strlen($value)) { $where .= sprintf( " and %s %s %s%s%s ", addslashes($Fname), $like, $quotes, addslashes($likewhat), $quotes ); $t++; } } $j++; } $query .= $where; $this->db->query($query); $this->db->next_record(); $rows=$this->db->Record['c']; if (!$export) { print " "; if ($this->csv_import[$this->table]) { print "
"; if ($rows == 0) { print "No records found. "; } else { print "$selectie $rows records found. "; } if ($this->settings['socketIPforClients'] && $this->settings['socketPort']) { $engineAddress = $this->settings['socketIPforClients'].":".$this->settings['socketPort']; if ($this->checkRatingEngineConnection()) { print " | Rating engine running at $engineAddress"; } else { print " | Cannot connect to rating engine $engineAddress"; } } print " | Rating documentation"; print "
"; printf( "
Select file Change Remove
", $this->table, $this->table ); print "
"; } else { print ""; } print "
"; $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { $SEARCH_NAME="search_".$Fname; $value=$_REQUEST[$SEARCH_NAME]; print ""; } $j++; } if ($this->table!=='prepaid_cards') { printf( " ", $this->table, $this->csv_export[$this->table], $this->csv_export[$this->table] ); } if ($this->settings['socketIPforClients'] && $this->settings['socketPort']) { if ($ReloadRatingTables) { reloadRatingEngineTables(); } else { $this->db->query("select var_value from settings where var_name = 'reloadRating' and var_value='1'"); if ($this->db->num_rows()) { print "table>Reload rating tables"; } } } print "
"; } else { $this->maxrowsperpage = 10000000; } if (!$next) { $i=0; $next=0; } else { $i=intval($next); } $j=0; $z=0; if ($rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $next; if ($maxrows > $rows) { $maxrows=$rows; $prev_rows=$maxrows; } } else { $maxrows=$rows; } if (!$order && $this->tables[$this->table]['order']) { $order = sprintf( " order by %s ", addslashes($this->tables[$this->table]['order']) ); } $query = sprintf( "select * from %s where (1=1) %s and %s %s limit %d, %d", addslashes($this->table), $where, $this->whereResellerFilter, $order, intval($i), intval($this->maxrowsperpage) ); $this->db->query($query); $num_fields=$this->db->num_fields(); $k=0; if (!$export) { if ($this->table=='prepaid') { print " "; } else { print "
"; } } while ($k < $cc) { $th = $metadata[$k]['name']; if (!in_array($th, $this->tables[$this->table]['exceptions'])) { if ($this->tables[$this->table]['fields'][$th]['name']) { $th=$this->tables[$this->table]['fields'][$th]['name']; } else { $th=ucfirst($th); } if (!$export) { print ""; } else { if ($k) { printf("%s%s", $delimiter, $th); } else { print "Ops"; } } $t_columns++; } $k++; } if ($export) { print "\n"; } if (!$export) { print " "; $t_columns=$t_columns+2; // SEARCH FORM print " "; // Search form print " "; $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { $SEARCH_NAME = "search_".$Fname; $value = $_REQUEST[$SEARCH_NAME]; if ($value != "") { $selection_made=1; } $maxlength=$size; if ($this->tables[$this->table]['fields'][$Fname]['size']) { $field_size = $this->tables[$this->table]['fields'][$Fname]['size']; } else { $field_size = $el_size; } $class=$this->tables[$this->table]['fields'][$Fname]['class']; if (!in_array($Fname, $this->tables[$this->table]['keys'])) { if (!$class) { $class = "span1"; } print ""; } else { print ""; } } $j++; } printf( " ", $PHP_SELF ); print " "; //print " // // // //"; if ($selection_made && !$this->tables[$this->table]['readonly']) { // Update all form print " "; $j=0; print " "; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if ($this->tables[$this->table]['fields'][$Fname]['size']) { $field_size=$this->tables[$this->table]['fields'][$Fname]['size']; } else { $field_size=$el_size; } $class=$this->tables[$this->table]['fields'][$Fname]['class']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { if (!in_array($Fname, $this->tables[$this->table]['keys'])) { if (!$class) { $class="span1"; } print ""; } else { print ""; } } $j++; } $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { $SEARCH_NAME="search_".$Fname; $value=$_REQUEST[$SEARCH_NAME]; print ""; } $j++; } if ($subweb_task=="Delete selection" && !$confirmDelete) { print " "; } elseif (!$this->tables[$this->table]['readonly']) { // Insert form $j=0; print " "; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if ($this->tables[$this->table]['fields'][$Fname]['size']) { $field_size=$this->tables[$this->table]['fields'][$Fname]['size']; } else { $field_size=$el_size; } $class=$this->tables[$this->table]['fields'][$Fname]['class']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { if (!in_array($Fname, $this->tables[$this->table]['keys'])) { if (!$class) { $class='span1'; } print ""; } else { print ""; } } $j++; } $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { $SEARCH_NAME = "search_".$Fname; $value = $_REQUEST[$SEARCH_NAME]; print ""; } $j++; } print " "; //print " // // // //"; } } while ($i < $maxrows) { $this->db->next_record(); $id = $this->db->f('id'); $status = $this->db->f('status'); $found = $i+1; if (!$export) { print " "; if ($this->table == 'prepaid') { $active_sessions = json_decode($this->db->f('active_sessions'), true); if (!isset($active_sessions)) { $active_sessions = array(); } $account=$this->db->f('account'); $extraInfo="
$thAction
Use _ to match one character and % to match any. Use > or < to find greater or smaller values.
  "; print("
"; print "

Use + or - to add/substract from curent values. Use * or / to multiply/divide curent values.
 "; print ""; print ""; print " ($rows records)"; } elseif (!$this->tables[$this->table]['readonly']) { if ($this->table == "billing_rates" && strlen($_REQUEST['search_name'])) { if ($subweb_task=="Copy rate" && !$confirmCopy) { print ""; print ""; } else { print ""; print "
"; } print " "; printf(" id %s to", $_REQUEST['search_name']); $query = sprintf( "select distinct(name) as name from billing_rates where name like '%s' order by name DESC limit 1", addslashes($_REQUEST['search_name']) ); $this->db1->query($query); $this->db1->next_record(); $_rateName = $this->db1->f('name'); $_rateName = preg_replace("/%/", "", $_rateName); if (preg_match("/^(.*)_(\d+)$/", $_rateName, $m)) { $_idx = $m[2] + 1; $newRateName = $m[1]."_".$_idx; } else { $newRateName = $_rateName."_1"; } printf( "", $_REQUEST['search_name'] ); $selected_newtable[$toRate]='selected'; printf( "", $newRateName, $selected_newtable[$newRateName], $newRateName, $selected_newtable['history'] ); } else { print "
"; print "
"; } } print "
table>
  table\">

"; $t=0; foreach (array_keys($active_sessions) as $_session) { $t++; $maxsessiontime=$active_sessions[$_session]['MaxSessionTime']; $extraInfo .= sprintf( "", $t, $_session ); $duration = time() - $active_sessions[$_session]['timestamp']; foreach (array_keys($active_sessions[$_session]) as $key) { if ($key=='timestamp') { $extraInfo .= sprintf( "", Date("Y-m-d H:i", $active_sessions[$_session]['timestamp']) ); $extraInfo .= sprintf( "", sec2hms($duration), $duration ); } else { $extraInfo .= sprintf( "", ucfirst($key), $active_sessions[$_session][$key] ); } } if ($maxsessiontime < $duration) { $extraInfo .= sprintf( "", $duration - $maxsessiontime ); $extraInfo .= ""; } //if (!$this->readonly) { //} } $extraInfo.=sprintf( "
%d. Session id%s
StartTime%s
Progress%s (%s s)
%s%s
Session expired since %d s
", $this->table, $next, $_session, $search_text ); } print "

$found. %s %s$value"; print ""; print ""; } else { print "
"; print ""; } print " table>
"; print "
"; if ($next != 0) { $show_next = $this->maxrowsperpage - $next; if ($show_next < 0) { $mod_show_next = $show_next - 2 * $show_next; print ""; } print " maxrowsperpage> table> "; $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { $SEARCH_NAME="search_".$Fname; $value=$_REQUEST[$SEARCH_NAME]; print " "; } $j++; } } print "
"; if ($rows>$this->maxrowsperpage && $rows!=$maxrows) { $show_next = $this->maxrowsperpage + $next; print " maxrowsperpage> table> "; $j=0; while ($j < $cc) { $Fname=$metadata[$j]['name']; $size=$metadata[$j]['len']; if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) { $SEARCH_NAME="search_".$Fname; $value=$_REQUEST[$SEARCH_NAME]; print ""; } $j++; } print " "; } print "
    "; if ($next!= 0) { print "
  • ← Previous
  • "; } if ($rows>$this->maxrowsperpage && $rows!=$maxrows) { print "
  • Next →
  • "; } print "
"; print " "; } } private function checkValues($table, $values = array()) { if (!$table) return false; $metadata = $this->db->metadata($table); if (!is_array($metadata)) return false; $k=1; while ($k < count($metadata)) { $db_name = $metadata[$k]['name']; $k++; $web_name = $this->tables[$table]['fields'][$db_name]['name']; $value = $values[$db_name]; $checkType = $this->tables[$table]['fields'][$db_name]['checkType']; $mustExist = $this->tables[$table]['fields'][$db_name]['mustExist']; if ($web_name) { $name_print=$web_name; } else { $name_print=$db_name; } if ($mustExist) { if (!strlen($value)) { printf("Error: field '%s' must be filled in\n", $name_print); return false; } } if ($checkType) { if (!strlen($value)) { if (!$mustExist) continue; } if ($checkType == 'sip_account') { if (!checkSipAccount($value)) { printf( "Error: value '%s' for field '%s' must be of format 'user@domain'\n", $value, $name_print ); return false; } } if ($checkType == 'domain') { if (stristr($value, "-.") || !preg_match("/^([a-zA-Z0-9][a-zA-Z0-9-]*\.)+[a-zA-Z]{2,}$/i", $value)) { printf( "Error: value '%s' for field '%s' must be of format 'example.com'\n", $value, $name_print ); return false; } } if ($checkType == 'ip') { if (!preg_match("/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i", $value, $m)) { printf( "Error: value '%s' for field '%s' must be of format 'X.X.X.X'\n", $value, $name_print ); return false; } else { $i=1; while ($i<=4) { if ($m[$i] < 0 || $m[$i] > 255) { printf( "Error: value '%s' for field '%s' must be of a valid IP address\n", $value, $name_print ); return false; } $i++; } } } if ($checkType == 'numeric') { if (!is_numeric($value)) { printf( "Error: value '%s' for field '%s' must be of type '%s'\n", $value, $name_print, $checkType ); return false; } } } } return true; } public function importTable($table = '') { // import a table from web if (!is_array($_FILES[$table]) || $_FILES[$table]['size'] == 0) return false; foreach ($this->importFilesPatterns as $_pattern) { if (strstr($_FILES[$table]['name'], $_pattern) && preg_match("/\.csv$/", $_FILES[$table]['name'])) { if ($this->CDRTool['filters']['reseller']) { $dir=$this->cvs_import_dir.'/'.$this->CDRTool['filters']['reseller']; if (!is_dir($dir)) { if (!mkdir($dir)) { printf("Error: cannot create directory %s", $dir); return false; } } $fullPath=$this->cvs_import_dir.'/'.$this->CDRTool['filters']['reseller'].'/'.$_FILES[$table]['name']; } else { $fullPath=$this->cvs_import_dir.'/'.$_FILES[$table]['name']; } if (!is_file($fullPath)) { if ($fp = fopen($fullPath, "w")) { } else { printf("Error: cannot open file %s for writing", $fullPath); return false; } } else { list($basename, $extension) = explode('.', $_FILES[$table]['name']); $j=0; while (1) { $j++; if ($this->CDRTool['filters']['reseller']) { $fullPath=$this->cvs_import_dir.'/'.$this->CDRTool['filters']['reseller'].'/'.$basename.'-'.$j.'.'.$extension; } else { $fullPath=$this->cvs_import_dir.'/'.$basename.'-'.$j.'.'.$extension; } if (is_file($fullPath)) continue; if ($fp = fopen($fullPath, "w")) { break; } else { printf("Error: cannot open file %s for writing", $fullPath); return false; } } } $content = fread( fopen($_FILES[$table]['tmp_name'], "r"), $_FILES[$table]['size'] ); fwrite($fp, $content); fclose($fp); printf( "

Imported %s bytes into %s", $_FILES[$table]['size'], $fullPath ); break; } } } } class OpenSIPSQuota { var $localDomains = array(); var $quotaGroup = 'quota'; // group set if subscriber was blocked by quota var $timeout = 5; // soap connection timeout var $daily_quota = 0; // by default do not check daily quota public function OpenSIPSQuota($parent) { global $DATASOURCES; $this->CDRdb = $parent->CDRdb; $this->table = $parent->table; $this->CDRTool = $parent->CDRTool; $this->cdr_source = $parent->cdr_source; $this->path=$this->CDRTool['Path']; $this->db_subscribers = $parent->db_subscribers; if (!class_exists($this->db_subscribers)) { printf("Info: No database defined for SIP accounts for source '%s'.\n", $this->cdr_source); return false; } $this->AccountsDB = new $this->db_subscribers; $this->enableThor = $parent->enableThor; $parent->LoadDomains(); $this->localDomains = $parent->localDomains; $this->cdr_source = $parent->cdr_source; $this->BillingPartyIdField = $parent->CDRFields['BillingPartyId']; $this->parent = $parent; $this->db = new DB_cdrtool; $this->db->Halt_On_Error="no"; $this->db1 = new DB_cdrtool; $this->db1->Halt_On_Error="no"; $this->db1 = new DB_cdrtool; $this->db1->Halt_On_Error="no"; $this->CDRS = $parent; $this->quota_init_flag = $parent->quota_init_flag; $this->quota_reset_flag = $parent->quota_reset_flag; if ($parent->daily_quota && is_numeric($parent->daily_quota) && $parent->daily_quota > 1 && $parent->daily_quota < 100) { $this->daily_quota = $parent->daily_quota; } // load e-mail addresses for quota notifications $query = "select * from settings where var_module = 'notifications'"; if ($this->db->query($query) && $this->db->num_rows()) { while ($this->db->next_record()) { $_bp = $this->db->f('billing_party'); $_name = $this->db->f('var_name'); $_value = $this->db->f('var_value'); if ($_bp && $_name && $_value) { $this->notificationAddresses[$_bp][$_name]=$_value; } } } if ($DATASOURCES[$this->cdr_source]['soapEngineId']) { require("/etc/cdrtool/ngnpro_engines.inc"); require_once("ngnpro_soap_library.php"); if (in_array($DATASOURCES[$this->cdr_source]['soapEngineId'], array_keys($soapEngines))) { $this->SOAPurl = $soapEngines[$DATASOURCES[$this->cdr_source]['soapEngineId']]['url']; $log = sprintf( "Using SOAP engine %s to block accounts at %s\n", $DATASOURCES[$this->cdr_source]['soapEngineId'], $this->SOAPurl ); syslog(LOG_NOTICE, $log); $this->SOAPlogin = array( "username" => $soapEngines[$DATASOURCES[$this->cdr_source]['soapEngineId']]['username'], "password" => $soapEngines[$DATASOURCES[$this->cdr_source]['soapEngineId']]['password'], "admin" => true ); $this->SoapAuth=array('auth', $this->SOAPlogin , 'urn:AGProjects:NGNPro', 0, ''); $this->soapclient = new WebService_NGNPro_SipPort($this->SOAPurl); $this->soapclient->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->soapclient->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); $this->soapclient->_options['timeout'] = $this->timeout; } else { $e = $DATASOURCES[$this->cdr_source]['soapEngineId']; $log = "Error: soap engine id $e not found in /etc/cdrtool/ngnpro_engines.inc\n"; print $log; syslog(LOG_NOTICE, $log); return false; } } else { $log = "Using database queries to block accounts\n"; syslog(LOG_NOTICE, $log); } } function ShowAccountsWithQuota($treshhold = '') { $query = sprintf( "select * from quota_usage where datasource = '%s' and quota > 0 and cost > 0", addslashes($this->CDRS->cdr_source) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } while ($this->db->next_record()) { if ($this->db->f('blocked')) { $blockedStatus="blocked"; } else { $blockedStatus=''; } $usageRatio = $this->db->f('cost') * 100 / $this->db->f('quota'); if ($treshhold && $treshhold > $usageRatio) continue; $usageStatus = sprintf("usage=%-10s", $this->db->f('cost')); printf( "%-35s quota=%-6s %s %.2f%s %s\n", $this->db->f('account'), $this->db->f('quota'), $usageStatus, $usageRatio, '%', $blockedStatus ); } } public function deblockAccounts($reset_quota_for = array()) { // deblock users blocked by quota if (!$this->db_subscribers) { print("Info: No database defined for SIP accounts.\n"); return false; } if (!count($reset_quota_for)) { printf("Deblocking all SIP accounts blocked by quota\n"); } else { printf("Deblocking %d SIP accounts blocked by quota\n", count($reset_quota_for)); } if ($this->enableThor) { $query = sprintf("select username, domain, profile from sip_accounts where (1=1) "); if (count($reset_quota_for)) { $k=0; foreach ($reset_quota_for as $_account) { if ($k) $usage_keys.= ", "; $usage_keys.="'".addslashes($_account)."'"; $k++; } $query.= "and CONCAT(username,'@',domain) in (".$usage_keys.")"; } if (!$this->AccountsDB->query($query)) { $log = sprintf("Error: %s (%s)", $this->AccountsDB->Error, $this->AccountsDB->Errno); syslog(LOG_NOTICE, $log); return false; } while ($this->AccountsDB->next_record()) { $i++; $_account=$this->AccountsDB->f('username')."@".$this->AccountsDB->f('domain'); $_profile=json_decode(trim($this->AccountsDB->f('profile'))); if (in_array('quota', $_profile->groups)) { $blockedAccounts[]=$_account; } if ($i%5000 == 0) { print "$i accounts checked for deblocking\n"; flush(); } } if ($i) { print "$i accounts checked for deblocking\n"; flush(); } } else { $query = sprintf( "select CONCAT(username,'@',domain) as account from grp where grp = '%s'", addslashes($this->quotaGroup) ); if (count($reset_quota_for)) { $k=0; foreach ($reset_quota_for as $_account) { if ($k) $usage_keys.= ", "; $usage_keys .= "'".addslashes($_account)."'"; $k++; } $query.= "and CONCAT(username,'@',domain) in (".$usage_keys.")"; } if (!$this->AccountsDB->query($query)) { $log = sprintf( "Database error: %s (%s)", $this->AccountsDB->Error, $this->AccountsDB->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $blockedAccounts=array(); while ($this->AccountsDB->next_record()) { $i++; $blockedAccounts[]=$this->AccountsDB->f('account'); if ($i%10000 == 0) { print "$i accounts checked for deblocking\n"; flush(); } } } if (count($reset_quota_for)) { $blockedAccounts = array_intersect($blockedAccounts, $reset_quota_for); } if (count($blockedAccounts) >0) { $this->unBlockRemoteAccounts($blockedAccounts); if (!$this->enableThor) { $query = sprintf("delete from grp where grp = '%s'", $this->quotaGroup); if (count($reset_quota_for)) { $k=0; foreach ($reset_quota_for as $_account) { if ($k) $usage_keys.= ", "; $usage_keys.="'".addslashes($_account)."'"; $k++; } $query.= "and CONCAT(username,'@',domain) in (".$usage_keys.")"; } if (!$this->AccountsDB->query($query)) { $log = sprintf( "Database error: %s (%s)", $this->AccountsDB->Error, $this->AccountsDB->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } } } if (count($blockedAccounts)) { $log = sprintf( "Reset %d users blocked by quota\n", count($blockedAccounts) ); print $log; syslog(LOG_NOTICE, $log); } } private function initQuotaUsageFromDatabase($month = "", $reset_quota_for = array()) { if (!$month) { $this->startTime=Date("Y-m-01 00:00", time()); } else { $this->startTime=$month."-01 00:00"; } $j=0; $usage_keys=''; if (count($reset_quota_for)) { $log = sprintf( "Init quota of data source %s for %d accounts\n", addslashes($this->CDRS->cdr_source), count($reset_quota_for) ); print $log; syslog(LOG_NOTICE, $log); $k=0; foreach ($reset_quota_for as $_account) { if ($k) $usage_keys.= ", "; $usage_keys.="'".addslashes($_account)."'"; $k++; } $usage_keys="and ".addslashes($this->BillingPartyIdField). " in (".$usage_keys.")"; } else { if (count($this->localDomains)) { $domain_filter="and Realm in ("; $t=0; foreach (array_keys($this->localDomains) as $_domain) { if (!$_domain) continue; if ($t) $domain_filter .= ","; $domain_filter .= sprintf("'%s'", addslashes($_domain)); $t++; } $domain_filter .= ") "; } $log = sprintf( "Init quota of data source %s for all accounts\n", $this->CDRS->cdr_source ); print $log; syslog(LOG_NOTICE, $log); } $query = sprintf( "select %s, count(*) as calls, sum(AcctSessionTime) as duration, sum(Price) as cost, sum(AcctInputOctets + AcctOutputOctets)/2 as traffic from %s where AcctStartTime >= '%s' and Normalized = '1' %s %s group by %s\n", addslashes($this->BillingPartyIdField), addslashes($this->table), addslashes($this->startTime), $domain_filter, $usage_keys, addslashes($this->BillingPartyIdField) ); if (!$this->CDRdb->query($query)) { if ($this->CDRdb->Errno != 1146) { $log = sprintf( "Database error: %s (%s)", $this->CDRdb->Error, $this->CDRdb->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } } $rows = $this->CDRdb->num_rows(); $log = sprintf( "%d callers generated traffic in %s for data source %s\n", $rows, Date("Y-m", time()), $this->CDRS->cdr_source ); print $log; flush(); syslog(LOG_NOTICE, $log); $j=0; $progress=0; while ($this->CDRdb->next_record()) { if ($rows > 1000) { if ($j > $progress * $rows/100) { $progress++; if ($progress % 10 == 0) { print "$progress% "; flush(); } } } unset($accounts); $accounts[$this->CDRdb->f($this->BillingPartyIdField)]['usage']['calls'] = $this->CDRdb->f('calls'); $accounts[$this->CDRdb->f($this->BillingPartyIdField)]['usage']['duration'] = $this->CDRdb->f('duration'); $accounts[$this->CDRdb->f($this->BillingPartyIdField)]['usage']['cost'] = $this->CDRdb->f('cost'); $accounts[$this->CDRdb->f($this->BillingPartyIdField)]['usage']['traffic'] = $this->CDRdb->f('traffic'); $accounts[$this->CDRdb->f($this->BillingPartyIdField)]['usage']['cost_today'] = 0; $this->CDRS->cacheQuotaUsage($accounts); $j++; } } public function checkQuota($notify) { global $UserQuota; $this->initQuotaUsage(); $query = sprintf( "select * from quota_usage where datasource = '%s' and quota > 0 and (cost > quota or cost_today >= quota * $this->daily_quota/100)", addslashes($this->CDRS->cdr_source) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $toNotify=array(); $_checks=0; while ($this->db->next_record()) { $account=$this->db->f('account'); list($username, $domain)=explode("@", $account); if ($this->db->f('cost') >= $this->db->f('quota')) { $quota_exceeded = true; $exceeded_period = 'monthly'; } elseif ($this->daily_quota && ($this->db->f('cost_today') >= $this->db->f('quota') * $this->daily_quota/100)) { $quota_exceeded = true; $exceeded_period = 'daily'; } else { $quota_exceeded = false; } if ($quota_exceeded) { $exceeding_accounts++; if (!$this->db->f('blocked')) { $reason='Cost exceeded'; if (!$seen_title) { $line = sprintf( "%40s %6s %8s %8s %13s %s\n", "User", "Calls", "Price", "Minutes", "Traffic", "Reason" ); print $line; $email_body=$line; $seen_title++; } $line = sprintf( "%40s %6s %8s %8s %10s MB %s\n", $account, $this->db->f('calls'), $this->db->f('cost'), number_format($this->db->f('duration') / 60, 0, "", ""), number_format($this->db->f('traffic') / 1024 / 1024, 2), $reason ); $email_body = $email_body.$line; print $line; if ($this->enableThor) { $this->domain_table = "sip_domains"; } else { $this->domain_table = "domain"; } $query = sprintf( "select * from %s where domain = '%s'", addslashes($this->domain_table), addslashes($domain) ); if (!$this->AccountsDB->query($query)) { $log = sprintf( "Database error: %s (%d) %s\n", $this->AccountsDB->Error, $this->AccountsDB->Errno, $query ); syslog(LOG_NOTICE, $log); } if ($this->AccountsDB->num_rows()) { $this->AccountsDB->next_record(); $_reseller = $this->AccountsDB->f('reseller_id'); } else { $_reseller = 0; } $log = sprintf( "%s quota exceeded for %s (%s > %s)", ucfirst($exceeded_period), $account, $this->db->f('cost'), $this->db->f('quota') ); syslog(LOG_NOTICE, $log); $log_query = sprintf( "insert into log (date,login,ip,datasource,results,description,reseller_id) values (NOW(),'quotacheck','localhost','QuotaCheck','1','%s',%d)", addslashes($log), $_reseller ); if (!$this->db1->query($log_query)) { $log = sprintf( "Database error: %s (%s)", $this->db1->Error, $this->db1->Errno ); print $log; syslog(LOG_NOTICE, $log); } if ($this->blockAccount($account)) { if ($notify) { $toNotify[]=$account; } $blocked_now++; $blockedAccountsNow=$blockedAccountsNow.$account."\n"; } } else { $blockedAccountsPrevious=$blockedAccountsPrevious.$account."\n"; $blocked_previous++; } } $_checks++; } if ($exceeding_accounts) { $line = sprintf("%6d accounts have exceeded their traffic limits\n", $exceeding_accounts); print $line; $email_body=$email_body.$line; } else { $log=sprintf("No quota has been exceeded\n"); syslog(LOG_NOTICE, $log); } if ($blocked_now) { $line = sprintf("%6d accounts have been blocked now\n", $blocked_now); $email_body=$email_body.$line; } if ($blockedAccountsNow) { $line = "Blocked accounts now:\n".$blockedAccountsNow; print $line; $email_body=$email_body.$line.$batch_block; } if ($blockedAccountsPrevious) { $line = "Blocked acccounts previously:\n".$blockedAccountsPrevious; print $line; $email_body=$email_body.$line.$batch_unblock; } // send notification to the provider if ($this->CDRTool['provider']['toEmail'] && $blockedAccountsNow) { $from = $this->CDRTool['provider']['fromEmail']; $to = $this->CDRTool['provider']['toEmail']; $bcc = $this->CDRTool['provider']['bccEmail']; $service = $this->CDRTool['provider']['service']; if (!$service) $service = "SIP"; if ($from) $extraHeaders="From: $from\r\nBCC: $from"; if ($bcc) $extraHeaders=$extraHeaders.",".$bcc; print("Notify CDRTool provider at $to\n"); mail($to, "$service platform - CDRTool quota check", $email_body, $extraHeaders); } if ($notify && is_array($toNotify) && count($toNotify) >0) { // send notification to accounts foreach ($toNotify as $rcpt) { $this->notify($rcpt); } } } function notify($account) { global $DATASOURCES; list($username, $domain) = explode("@", $account); if (!$DATASOURCES[$this->cdr_source]['UserQuotaNotify']) { return false; } // get account information if ($this->enableThor) { $query = sprintf( "select first_name,last_name,email,profile from sip_accounts where username = '%s' and domain = '%s'", addslashes($username), addslashes($domain) ); } else { $query = sprintf( "select first_name,last_name,email_address as email,profile from subscriber where username = '%s' and domain = '%s'", addslashes($username), addslashes($domain) ); } if (!$this->AccountsDB->query($query)) { $log = sprintf( "Database error: %s (%s)", $this->AccountsDB->Error, $this->AccountsDB->Errno ); syslog(LOG_NOTICE, $log); return false; } if (!$this->AccountsDB->num_rows()) return false; $this->AccountsDB->next_record(); $fullname = $this->AccountsDB->f('first_name')." ".$this->AccountsDB->f('last_name'); $toEmail = $this->AccountsDB->f('email'); $profile = json_decode($this->AccountsDB->f('profile'), true); $providerName=$this->notificationAddresses[$domain]['providerName']; if (!$providerName) $providerName="your SIP service provider"; $body = sprintf( "Dear __NAME__,\n\n". "Your SIP account %s has been temporarily blocked\n". "because your monthly quota has been exceeded.\n\n". "To unblock your account you may contact %s.\n\n". "N.B. This is an automatically generated message. Do not reply to it.\n", $account, $providerName ); $fromEmail = $this->CDRTool['provider']['fromEmail']; $bccEmail = $this->CDRTool['provider']['bccEmail']; $seen_bcc[$bccEmail]++; if ($this->notificationAddresses[$domain]['fromEmail']) { $fromEmail=$this->notificationAddresses[$domain]['fromEmail']; } if ($this->notificationAddresses[$domain]['quotaBody']) { $body=$this->notificationAddresses[$domain]['quotaBody']; } if ($this->notificationAddresses[$domain]['quotaSubject']) { $subject=$this->notificationAddresses[$domain]['quotaSubject']; } $body = preg_replace("/__NAME__/", $fullname, $body); $body = preg_replace("/__ACCOUNT__/", $account, $body); $body = preg_replace("/__CALLERID__/", "$profile[rpid]", $body); if (!$subject) { $subject=sprintf("Monthly quota exceeded for account %s", $account); } else { $subject=preg_replace("/__ACCOUNT__/", $account, $subject); $subject=preg_replace("/__CALLERID__/", "$profile[rpid]", $subject); } if (!$toEmail || !$fromEmail) { return false; } $seen_bcc[$toEmail]++; $extraHeaders="From: $fromEmail"; if ($this->notificationAddresses[$domain][bccEmail]) { if ($bccEmail) $bccEmail.= ","; $bccEmail.=$this->notificationAddresses[$domain][bccEmail]; } if ($bccEmail) $extraHeaders = $extraHeaders."\r\nBCC: ".$bccEmail; mail($toEmail, $subject, $body, $extraHeaders); $log_msg = sprintf( "Monthly quota exceeded for %s. Notified To:%s From:%s\n", $account, $toEmail, $fromEmail ); syslog(LOG_NOTICE, $log_msg); print $log_msg; } function blockAccount($account) { list($username, $domain) = explode("@", $account); if (is_object($this->soapclient)) { return $this->blockAccountRemote($account); } else { $query = sprintf( "insert into grp (username,domain,grp,last_modified) values ('%s','%s','%s',NOW())", addslashes($username), addslashes($domain), addslashes($this->quotaGroup) ); if (!$this->AccountsDB->query($query)) { if ($this->AccountsDB->Errno != 1062) { $log = sprintf( "Database error: %s (%s)", $this->AccountsDB->Error, $this->AccountsDB->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } else { return true; } } else { $this->markBlocked($account); return true; } } } function blockAccountRemote($account) { list($username, $domain) = explode("@", $account); if (!$username || !$domain) { $log = sprintf("Error: misssing username/domain in blockAccountRemote()"); syslog(LOG_NOTICE, $log); return false; } $this->soapclient->addHeader($this->SoapAuth); $result = $this->soapclient->addToGroup(array("username" => $username,"domain"=> $domain), "quota"); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault = $result->getFault(); $error_code = $result->getCode(); $log = sprintf( "Error from %s: %s (%s)", $this->SOAPurl, $error_fault->faultstring, $error_fault->faultcode ); syslog(LOG_NOTICE, $log); print $log; if ($error_fault->detail->exception->errorcode != "1030") { $from = $this->CDRTool['provider']['fromEmail']; $to = $this->CDRTool['provider']['toEmail']; $extraHeaders = "From: $from"; $email_body = "Remote SOAP request failure when calling blockAccountRemote(): \n\n". $log; mail($to, "CDRTool SOAP client failure", $email_body, $extraHeaders); } return false; } else { $log = sprintf("Block account %s at %s", $account, $this->SOAPurl); syslog(LOG_NOTICE, $log); $this->markBlocked($account); return true; } } function unBlockRemoteAccounts($accounts) { if (!is_object($this->soapclient)) { return; } foreach ($accounts as $account) { list($username, $domain)=explode("@", $account); if (!$username || !$domain) return true; $this->soapclient->addHeader($this->SoapAuth); $result = $this->soapclient->removeFromGroup(array("username" => $username,"domain"=> $domain), "quota"); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault = $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode && $error_fault->detail->exception->errorcode != "1030" && $error_fault->detail->exception->errorcode != "1031" ) { $from = $this->CDRTool[provider][fromEmail]; $to = $this->CDRTool[provider][toEmail]; $extraHeaders="From: $from"; $email_body="SOAP request failure: \n\n". $log = sprintf( "SOAP client error: %s %s\n", $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); mail($to, "CDRTool SOAP failure", $email_body, $extraHeaders); } } else { $log = sprintf("Unblock remote account %s at %s", $account, $this->SOAPurl); syslog(LOG_NOTICE, $log); } } } function saveQuotaInitFlag() { $query = sprintf("insert into memcache (`key`,`value`) values ('%s','1')", addslashes($this->quota_init_flag)); if (!$this->db->query($query)) { if ($this->db->Errno != '1062') { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } } return true; } function deleteQuotaInitFlag() { $query = sprintf( "delete from memcache where `key` in ('%s','%s')", addslashes($this->quota_init_flag), addslashes($this->quota_reset_flag) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } return true; } function deleteQuotaUsageFromCache ($reset_quota_for=array()) { $query = sprintf( "delete from quota_usage where datasource = '%s' ", addslashes($this->CDRS->cdr_source) ); if (count($reset_quota_for)) { $query.= " and account in ("; $t=0; foreach ($reset_quota_for as $_account) { if ($t) $query.=","; $query.= sprintf("'%s'", $_account); $t++; } $query.=")"; } if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->affected_rows()) { $log = sprintf("Deleted %d keys from cache\n", $this->db->affected_rows()); print $log; syslog(LOG_NOTICE, $log); } return true; } private function initQuotaUsage() { $query = sprintf( "select value from memcache where `key` = '%s'", addslashes($this->quota_init_flag) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } if ($this->db->num_rows()) return true; $lockName = sprintf("%s:%s", $this->CDRS->cdr_source, $this->CDRS->table); if (!$this->CDRS->getNormalizeLock($lockName)) { $log = "Error: cannot initialize now the quota because a normalization process in progress\n"; print $log; syslog(LOG_NOTICE, $log); return false; } $query = sprintf( "select value from memcache where `key` = '%s'", addslashes($this->quota_reset_flag) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } $reset_quota_for= array(); if ($this->db->num_rows()) { $this->db->next_record(); $reset_quota_for = json_decode($this->db->f('value')); } $this->deblockAccounts($reset_quota_for); $this->deleteQuotaUsageFromCache($reset_quota_for); $this->initQuotaUsageFromDatabase('', $reset_quota_for); if ($this->CDRS->status['cached_keys']['saved_keys']) { $log = sprintf( "Saved %d accounts in quota cache\n", $this->CDRS->status['cached_keys']['saved_keys'] ); print $log; syslog(LOG_NOTICE, $log); } if ($this->CDRS->status['cached_keys']['failed_keys']) { $log = sprintf( "Error: failed to save %d account\n", $this->CDRS->status['cached_keys']['failed_keys'] ); print $log; syslog(LOG_NOTICE, $log); } if ($this->saveQuotaInitFlag()) { $query = sprintf( "delete from memcache where `key` = '%s'", addslashes($this->quota_reset_flag) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } return true; } else { $log = "Error: failed to save key quotaCheckInit"; syslog(LOG_NOTICE, $log); return false; } } function markBlocked($account) { $query = sprintf( "update quota_usage set blocked = '1', notified = NOW() where account = '%s' and datasource = '%s'", addslashes($account), addslashes($this->CDRS->cdr_source) ); if (!$this->db1->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db1->Error, $this->db1->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } } function resetDailyQuota() { $query = sprintf( "update quota_usage set cost_today = 0 where datasource = '%s'", addslashes($this->CDRS->cdr_source) ); if (!$this->db1->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->db1->Error, $this->db1->Errno ); print $log; syslog(LOG_NOTICE, $log); return false; } return true; } } class RatingEngine { var $method = ''; var $log_runtime = false; var $prepaid_table = "prepaid"; var $init_ok = false; public function RatingEngine() { global $RatingEngine; // set in global.inc global $DATASOURCES; // set in global.inc if (!strlen($RatingEngine['socketIP']) || !$RatingEngine['socketPort'] || !$RatingEngine['cdr_source']) { $log = sprintf("Please define \$RatingEngine['socketIP'], \$RatingEngine['socketPort'] and \$RatingEngine['cdr_source'] in /etc/cdrtool/global.inc\n"); syslog(LOG_NOTICE, $log); return false; } if (preg_match("/^\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}$/", $RatingEngine['socketIP'])) { $log = sprintf("Invalid \$RatingEngine['socketIP'] in /etc/cdrtool/global.inc\n"); syslog(LOG_NOTICE, $log); return false; } if (intval($RatingEngine['socketPort']) < 1 || intval($RatingEngine['socketPort']) > 65535) { $log = sprintf("Invalid \$RatingEngine['socketPort'] in /etc/cdrtool/global.inc\n"); syslog(LOG_NOTICE, $log); return false; } if (!is_array($DATASOURCES[$RatingEngine['cdr_source']])) { $log = sprintf("Datasource '%s' does not exist in /etc/cdrtool/global.inc\n", $RatingEngine['cdr_source']); syslog(LOG_NOTICE, $log); return false; } $this->settings = $RatingEngine; if ($this->settings['log_runtime']) { $this->log_runtime=true; } // init database $this->db = new DB_CDRTool; $query=sprintf("delete from memcache where `key` = 'destinations_sip' or `key` = 'destinations'"); if (!$this->db->query($query)) { $log = sprintf( "Database error: %s (%s) for query %s", $db->Error, $db->Errno, $query ); syslog(LOG_NOTICE, $log); } // init CDR datasource $CDR_class = $DATASOURCES[$RatingEngine['cdr_source']]['class']; $this->CDRS = new $CDR_class($RatingEngine['cdr_source']); // load Rating Tables $this->CDRS->RatingTables = new RatingTables(); $this->CDRS->RatingTables->LoadRatingTables(); // init subscribers database $this->db_subscribers_class = $this->CDRS->db_subscribers; if (!class_exists($this->db_subscribers_class)) { syslog(LOG_NOTICE, "Error: No database defined for SIP accounts"); return false; } $this->AccountsDB = new $this->db_subscribers_class; $this->enableThor = $this->CDRS->enableThor; $this->init_ok = true; } function reloadRatingTables() { $b=time(); //$query="delete from memcache where `key` in ('destinations','destinations_sip','ENUMtlds')"; $query = "delete from memcache where `key` in ('ENUMtlds')"; if (!$this->db->query($query)) { $log = sprintf( "Database error: %s (%s)", $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE,$log); } $this->CDRS->RatingTables->LoadRatingTables(); $e=time(); $d=$e-$b; if ($d > 0 ) syslog(LOG_NOTICE, "Reloaded rating tables in $d seconds"); $b=time(); $this->CDRS->LoadDestinations(); $e=time(); $d=$e-$b; if ($d > 0 ) syslog(LOG_NOTICE, "Reloaded destinations in $d seconds"); $this->db->query("update settings set var_value = '' where var_name = 'reloadRating'"); return 1; } function reloadCustomers($customerFilter) { return 1; } function reloadDomains() { return 1; } function reloadQuota($account) { if (!$account) return false; $quota = $this->getQuota($account); $blocked = $this->getBlockedByQuotaStatus($account); $query = sprintf( "update quota_usage set quota = '%s', blocked = '%s' where datasource = '%s' and account = '%s'", $quota, intval($blocked), $this->CDRS->cdr_source, addslashes($account) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query '%s': %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return 0; } return 1; } function getBalanceHistory($account, $limit = 50) { list($username, $domain)=explode("@", $account); if (!$username || !$domain) return 0; $query = sprintf( "select * from prepaid_history where username = '%s' and domain = '%s' order by id desc", addslashes($username), addslashes($domain) ); if ($limit) $query.= sprintf(" limit %d", $limit); if (!$this->db->query($query)) { $log = sprintf( "getBalanceHistory error: %s (%s)", $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return 0; } while ($this->db->next_record()) { $history[] = array( 'account' => $account, 'action' => $this->db->f('action'), 'description' => $this->db->f('description'), 'value' => $this->db->f('value'), 'balance' => $this->db->f('balance') ); } $line = json_encode($history); return $line; } function DebitBalanceAudio($account, $balance, $session_id, $duration, $force = false) { $this->old_session_count = 0; $this->new_session_count = 0; $els = explode(":", $account); if (count($els) == 2) { $account=$els[1]; } if (!$account) { syslog(LOG_NOTICE, "DebitBalanceAudio() error: missing account"); return 0; } if (!is_numeric($balance)) { syslog(LOG_NOTICE, "DebitBalanceAudio() error: balance must be numeric"); return 0; } if (!$session_id) { syslog(LOG_NOTICE, "DebitBalanceAudio() error: missing call id"); return 0; } $query = sprintf( "select * from %s where account = '%s'", addslashes($this->prepaid_table), addslashes($account) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); $this->logRuntime(); return 0; } if (!$this->db->num_rows()) { $log = sprintf("DebitBalanceAudio() error: account %s does not exist", $account); syslog(LOG_NOTICE, $log); $this->logRuntime(); return 0; } $this->db->next_record(); if (strlen($this->db->f('active_sessions'))) { // remove active session $active_sessions = array(); $old_active_sessions = json_decode($this->db->f('active_sessions'), true); $destination=$old_active_sessions[$session_id]['Destination']; if (!$force) { if (!in_array($session_id, array_keys($old_active_sessions))) { $this->sessionDoesNotExist=true; $log = sprintf( "Error: session %s of %s does not exist", $session_id, $account ); syslog(LOG_NOTICE, $log); return 0; } } foreach (array_keys($old_active_sessions) as $_key) { if ($_key==$session_id) continue; $active_sessions[$_key]=$old_active_sessions[$_key]; } } else { if (!$force) { $this->sessionDoesNotExist=true; $log = sprintf( "Error: session %s for %s does not exist", $session_id, $account ); syslog(LOG_NOTICE, $log); return 0; } } $next_balance = $this->db->f('balance') - $balance; //get parallel calls and remaining_balance $this->getActivePrepaidSessions($active_sessions, $next_balance, $account); // calculate the updated maxsessiontime $maxsessiontime = $this->getAggregatedMaxSessiontime( $this->parallel_calls, $this->remaining_balance, $account ); $this->old_session_count = count($old_active_sessions); $this->new_session_count = count($active_sessions); $query = sprintf( "update %s set balance = balance - '%s', change_date = NOW(), active_sessions = '%s', session_counter = '%s' where account = '%s'", addslashes($this->prepaid_table), addslashes($balance), addslashes(json_encode($active_sessions)), count($active_sessions), addslashes($account) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return 0; } if ($balance > 0) { list($prepaidUser, $prepaidDomain)=explode("@", $account); if ($this->enableThor) { $this->domain_table = "sip_domains"; } else { $this->domain_table = "domain"; } $query = sprintf( "select * from %s where domain = '%s'", addslashes($this->domain_table), addslashes($prepaidDomain) ); if (!$this->AccountsDB->query($query)) { $log = sprintf( "Database error: %s (%d) %s\n", $this->AccountsDB->Error, $this->AccountsDB->Errno, $query ); syslog(LOG_NOTICE, $log); } if ($this->AccountsDB->num_rows()) { $this->AccountsDB->next_record(); $_reseller=$this->AccountsDB->f('reseller_id'); } else { $_reseller=0; } $query = sprintf( "insert into prepaid_history (username,domain,action,description,value,balance,date,session,duration,destination,reseller_id) values ('%s','%s','Debit balance','Session to %s for %ds','-%s','%s',NOW(),'%s','%d','%s',%d)", addslashes($prepaidUser), addslashes($prepaidDomain), addslashes($destination), addslashes($duration), addslashes($balance), addslashes($next_balance), addslashes($session_id), addslashes($duration), addslashes($destination), addslashes($_reseller) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); } } return $maxsessiontime; } function DebitBalanceMessage($account, $destination, $balance, $session_id) { $els = explode(":", $account); if (count($els) == 2) { $account=$els[1]; } if (!$account) { syslog(LOG_NOTICE, "DebitBalanceMessage() error: missing account"); return 0; } if (!is_numeric($balance)) { syslog(LOG_NOTICE, "DebitBalanceMessage() error: balance must be numeric"); return 0; } if (!$session_id) { syslog(LOG_NOTICE, "DebitBalanceMessage() error: missing call id"); return 0; } $query = sprintf( "select * from %s where account = '%s'", addslashes($this->prepaid_table), addslashes($account) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); $this->logRuntime(); return 0; } if (!$this->db->num_rows()) { $log = sprintf("DebitBalanceMessage() error: account %s does not exist", $account); syslog(LOG_NOTICE, $log); $this->logRuntime(); return 0; } $this->db->next_record(); if (strlen($this->db->f('active_sessions'))) { $active_sessions = json_decode($this->db->f('active_sessions'), true); } $next_balance=$this->db->f('balance')-$balance; //get parallel calls and remaining_balance $this->getActivePrepaidSessions($active_sessions, $next_balance, $account); // calculate the updated maxsessiontime $maxsessiontime = $this->getAggregatedMaxSessiontime( $this->parallel_calls, $this->remaining_balance, $account ); $query = sprintf( "update %s set balance = balance - '%s', change_date = NOW() where account = '%s'", addslashes($this->prepaid_table), addslashes($balance), addslashes($account) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return 0; } if ($balance > 0) { list($prepaidUser, $prepaidDomain) = explode("@", $account); if ($this->enableThor) { $this->domain_table = "sip_domains"; } else { $this->domain_table = "domain"; } $query = sprintf( "select * from %s where domain = '%s'", addslashes($this->domain_table), addslashes($prepaidDomain) ); if (!$this->AccountsDB->query($query)) { $log = sprintf( "Database error: %s (%d) %s\n", $this->AccountsDB->Error, $this->AccountsDB->Errno, $query ); syslog(LOG_NOTICE, $log); } if ($this->AccountsDB->num_rows()) { $this->AccountsDB->next_record(); $_reseller=$this->AccountsDB->f('reseller_id'); } else { $_reseller=0; } $query = sprintf( "insert into prepaid_history (username,domain,action,description,value,balance,date,session,destination,reseller_id) values ('%s','%s','Debit balance','Message to %s','-%s','%s',NOW(),'%s','%s',%d)", addslashes($prepaidUser), addslashes($prepaidDomain), addslashes($destination), addslashes($balance), addslashes($next_balance), addslashes($session_id), addslashes($destination), addslashes($_reseller) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); } } return true; } function CreditBalance($account, $balance) { if (!is_numeric($balance)) { syslog(LOG_NOTICE, "CreditBalance() error: balance \"$balance\"is invalid"); return 0; } $els = explode(":", $account); if (count($els) == 2) { $account=$els[1]; } if (!$account) { syslog(LOG_NOTICE, "CreditBalance() error: missing account"); return 0; } list($prepaidUser, $prepaidDomain) = explode("@", $account); $query = sprintf( "select * from %s where account = '%s'", addslashes($this->prepaid_table), addslashes($account) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); $this->logRuntime(); return 0; } if ($this->db->num_rows()) { $this->db->next_record(); $current_balance = $this->db->f('balance'); $query = sprintf( "update %s set balance = balance + '%s', change_date = NOW() where account = '%s'", addslashes($this->prepaid_table), addslashes($balance), addslashes($account) ); $this->db->query($query); if ($this->db->affected_rows()) { $new_balance = $current_balance + $balance; $log = sprintf("Prepaid account %s credited with %s", $account, $balance); syslog(LOG_NOTICE, $log); // log to prepaid_history $query = sprintf( "insert into prepaid_history (username,domain,action,description,value,balance,date) values ('%s','%s','Set balance','Manual update','%s','%s',NOW())", addslashes($prepaidUser), addslashes($prepaidDomain), addslashes($balance), addslashes($new_balance) ); if (!$this->db->query($query)) { $log = sprintf("Error: %s (%s)", $this->db->Error, $this->db->Errno); syslog(LOG_NOTICE, $log); } return 1; } else { $log = sprintf( "CreditBalance() error: failed to credit balance: %s (%s)", $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return 0; } } else { $query = sprintf( "insert into %s (balance, account, change_date) values ('%s','%s',NOW())", addslashes($this->prepaid_table), addslashes($balance), addslashes($account) ); $this->db->query($query); if ($this->db->affected_rows()) { $log = sprintf("Added prepaid account %s with balance=%s", $account, $balance); syslog(LOG_NOTICE, $log); // log to prepaid_history $query = sprintf( "insert into prepaid_history (username,domain,action,description,value,balance,date) values ('%s','%s','Set balance','Manual update','%s','%s',NOW())", addslashes($prepaidUser), addslashes($prepaidDomain), addslashes($balance), addslashes($balance) ); if (!$this->db->query($query)) { $log = sprintf("Error: %s (%s)", $this->db->Error, $this->db->Errno); syslog(LOG_NOTICE, $log); } return 1; } else { $log = sprintf( "CreditBalance() error: failed to credit balance: %s (%s)", $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return 0; } } } function DeleteBalance($account) { $els = explode(":", $account); if (count($els) == 2) { $account = $els[1]; } if (!$account) { syslog(LOG_NOTICE, "DeleteBalance() error: missing account"); return 0; } $query = sprintf( "delete from %s where account = '%s'", addslashes($this->prepaid_table), addslashes($account) ); if (!$this->db->query($query)) { $log = sprintf( "DeleteBalance error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return 0; } $log = sprintf("Prepaid account %s has been deleted", $account); syslog(LOG_NOTICE, $log); return 1; } function DeleteBalanceHistory($account) { $account=trim($account); $els = explode(":", $account); if (count($els) == 2) { $account=$els[1]; } if (!$account) { syslog(LOG_NOTICE, "DeleteBalanceHistory() error: missing account"); return 0; } list($username, $domain) = explode('@', $account); $query = sprintf( "delete from prepaid_history where username = '%s' and domain = '%s'", addslashes($username), addslashes($domain) ); if (!$this->db->query($query)) { $log = sprintf( "DeleteBalanceHistory error for query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return 0; } $log = sprintf("History of prepaid account %s has been deleted", $account); syslog(LOG_NOTICE, $log); return 1; } function GetEntityProfiles($entity) { if (!$entity) { syslog(LOG_NOTICE, "GetEntityProfiles"); return 0; } $query = sprintf( "select * from billing_customers where subscriber = '%s' or domain = '%s' or gateway = '%s'", addslashes($entity), addslashes($entity), addslashes($entity) ); if (!$this->db->query($query)) { $log = sprintf( "GetEntityProfiles error: %s (%s)", $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return 0; } if ($this->db->num_rows() == 1) { $this->db->next_record(); $entity = array( 'entity' => $entity, 'profileWeekday' => $this->db->f('profile_name1'), 'profileWeekdayAlt' => $this->db->f('profile_name1_alt'), 'profileWeekend' => $this->db->f('profile_name2'), 'profileWeekendAlt' => $this->db->f('profile_name2_alt'), 'timezone' => $this->db->f('timezone'), 'increment' => $this->db->f('increment'), 'min_duration' => $this->db->f('min_duration') ); } $line = json_encode($entity); return $line; } function SetEntityProfiles($entity, $profiles) { if (!$entity) { syslog(LOG_NOTICE, "SetEntityProfiles"); return 0; } } function showHelp() { $help= "Version\n". "Help\n". "ShowClients\n". "MaxSessionTime CallId=6432622xvv@1 From=sip:123@example.com To=sip:0031650222333@example.com Duration=7200 Gateway=10.0.0.1 Lock=1\n". "ShowPrice From=sip:123@example.com To=sip:0031650222333@example.com Gateway=10.0.0.1 Duration=59\n". "DebitBalance CallId=6432622xvv@1 From=sip:123@example.com To=sip:0031650222333@example.com Gateway=10.0.0.1 Duration=59\n". "AddBalance From=123@example.com Value=10.00\n". "GetBalance From=123@example.com\n". "GetBalanceHistory From=123@example.com\n". "DeleteBalance From=123@example.com\n". "DeleteBalanceHistory From=123@example.com\n". "ReloadQuota Account=abc@example.com\n". "GetEntityProfiles Entity=abc@example.com\n". "DumpPrepaidSessions Account=123@example.com\n". "ReloadRatingTables\n". "ReloadDomains\n". "ShowProfiles\n". "ShowENUMtlds\n" ; return $help; } function logRuntime() { if (!$this->log_runtime) return; $t=0; $log=''; foreach (array_keys($this->runtime) as $_key) { $stamp=$this->runtime[$_key]; if ($prev_stamp) { $_exec_time = $stamp - $prev_stamp; $log .= sprintf("%s=%1.7f ", $_key, $_exec_time); } $prev_stamp = $stamp; $t++; } syslog(LOG_NOTICE, $log); } function processNetworkInput($tinput) { // Read key=value pairs from input // Strip any unnecessary spaces $this->runtime = array(); $tinput = preg_replace("/\s+/", " ", $tinput); if ($tinput == "/" and strlen($this->last_input)) { $tinput = $this->last_input; } else { $this->last_input = $tinput; } $_els = explode(" ", trim($tinput)); $this->runtime['start']=microtime_float(); syslog(LOG_NOTICE, "Got command: $tinput"); if (!$_els[0]) return 0; // read fields from input unset($NetFields); unset($seenField); $i=0; while ($i < count($_els)) { $i++; $_dict = explode("=", $_els[$i]); $_key = strtolower(trim($_dict[0])); if ($_key == 'callid') { $_value = trim($_dict[1]); } else { $_value = strtolower(trim($_dict[1])); } if ($_key && $seenField[$_key]) { $log = sprintf( "Error: '$_key' attribute is present more than once in $tinput" ); syslog(LOG_NOTICE, $log); return 0; } else { if ($_key) { $NetFields[$_key]=$_value; $seenField[$_key]++; } } } $NetFields['action'] = strtolower($_els[0]); $this->method = $NetFields['action']; // begin processing if ($NetFields['action']=="maxsessiontime") { if (!$NetFields['from']) { $log = "Error: missing From parameter"; syslog(LOG_NOTICE, $log); return $log; } if (!$NetFields['to']) { $log = "Error: missing To parameter"; syslog(LOG_NOTICE, $log); return $log; } if (!$NetFields['gateway']) { $log = "Error: missing gateway parameter"; syslog(LOG_NOTICE, $log); return $log; } if (!$NetFields['callid']) { $log = "Error: missing Call Id parameter"; syslog(LOG_NOTICE, $log); return $log; } if (!$NetFields['duration'] && $this->settings['MaxSessionTime']) { $NetFields['duration']=$this->settings['MaxSessionTime']; } $app_prefix = preg_replace('/[.].*$/', '', $NetFields['application']); if (strlen($app_prefix)) { if ($app_prefix == 'audio' || $app_prefix == 'sms') { $application=$NetFields['application']; } else { $log = sprintf( "Error: unsupported application %s", $NetFields['application'] ); syslog(LOG_NOTICE, $log); return $log; } } else { $application='audio'; } list($username_t, $domain_t) = explode("@", $NetFields['from']); $CDRStructure = array( $this->CDRS->CDRFields['callId'] => $NetFields['callid'], $this->CDRS->CDRFields['aNumber'] => $NetFields['from'], $this->CDRS->CDRFields['CanonicalURI'] => $NetFields['to'], $this->CDRS->CDRFields['gateway'] => $NetFields['gateway'], $this->CDRS->CDRFields['duration'] => floor($NetFields['duration']), $this->CDRS->CDRFields['timestamp'] => time(), $this->CDRS->CDRFields['domain'] => $domain_t, $this->CDRS->CDRFields['application'] => $application, 'skip_fix_prepaid_duration' => true ); $CDR = new $this->CDRS->CDR_class($this->CDRS, $CDRStructure); $CDR->normalize(); $this->runtime['normalize_cdr'] = microtime_float(); $query = sprintf( "select * from %s where account = '%s'", addslashes($this->prepaid_table), addslashes($CDR->BillingPartyId) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for query '%s': %s (%s), link_id =%s, query_id =%s", $query, $this->db->Error, $this->db->Errno, $this->db->Link_ID, $this->db->Query_ID ); syslog(LOG_NOTICE, $log); $this->logRuntime(); $ret = sprintf( "Error: database error for query '%s': %s (%s)", $query, $this->db->Error, $this->db->Errno )."\n"."type=prepaid"; return $ret; } if (!$this->db->num_rows()) { $log = sprintf( "MaxSessionTime=unlimited Type=postpaid CallId=%s BillingParty=%s", $NetFields['callid'], $CDR->BillingPartyId ); syslog(LOG_NOTICE, $log); $ret="none"."\n"."type=postpaid"; return $ret; } $this->db->next_record(); $current_balance = $this->db->f('balance'); $old_session_counter = $this->db->f('session_counter'); $max_sessions = $this->db->f('max_sessions'); if (strlen($this->db->f('active_sessions'))) { // load active sessions $active_sessions = json_decode($this->db->f('active_sessions'), true); if (count($active_sessions)) { // purge stale sessions $active_sessions_new=array(); $expired=0; foreach (array_keys($active_sessions) as $_session) { $expired_since = time() - $active_sessions[$_session]['timestamp'] - $active_sessions[$_session]['MaxSessionTime']; if ($expired_since > 120) { // this session has passed its maxsessiontime plus its reasonable setup time of 2 minutes, // it could be stale // because the call control module did not call debitbalance, so we purge it $log = sprintf( "Session %s for %s has expired since %d seconds", $_session, $active_sessions[$_session]['BillingPartyId'], $expired_since ); syslog(LOG_NOTICE, $log); $expired++; } else { $active_sessions_new[$_session]=$active_sessions[$_session]; } } if ($expired) { $active_sessions=$active_sessions_new; } } } else { $active_sessions=array(); } if (!$current_balance) { $log = "No balance found"; syslog(LOG_NOTICE, $log); $this->logRuntime(); $ret="0"."\n"."type=prepaid"; return $ret; } if (preg_match("/^0[0-9]{1,}@/", $CDR->CanonicalURINormalized)) { if (!$CDR->DestinationId) { $log = sprintf( "Error: cannot figure out the destination id for %s", $CDR->CanonicalURI ); $this->logRuntime(); syslog(LOG_NOTICE, $log); $ret=$log."\n"."type=prepaid"; return $ret; } } else { $log = sprintf( "MaxSessionTime=unlimited Type=prepaid CallId=%s BillingParty=%s DestId=None", $NetFields['callid'], $CDR->BillingPartyId ); syslog(LOG_NOTICE, $log); $this->logRuntime(); $ret="none"."\n"."type=prepaid"; return $ret; } $session_counter=count($active_sessions); if ($max_sessions && $session_counter >= $max_sessions) { $log = sprintf( "Locked: maximum number of concurrent calls %s reached, %s allowed", $session_counter, $max_sessions ); syslog(LOG_NOTICE, $log); $ret="Locked"."\n"."type=prepaid"; return $ret; } $maxduration=0; // Build Rate dictionary containing normalized CDR fields plus customer Balance if (count($active_sessions)) { // set $this->remaining_balance and $this->parallel_calls for ongoing calls: if (!$this->getActivePrepaidSessions($active_sessions, $current_balance, $CDR->BillingPartyId, array($CDR->callId))) { $ret="0"."\n"."type=prepaid"; return $ret; } $this->runtime['get_parallel_calls']=microtime_float(); // add this new call to the list of parallel calls $RateDictionary = array( 'duration' => $CDR->duration, 'callId' => $CDR->callId, 'Balance' => $this->remaining_balance, 'timestamp' => $CDR->timestamp, 'DestinationId' => $CDR->DestinationId, 'region' => $CDR->region, 'domain' => $CDR->domain, 'gateway' => $CDR->gateway, 'BillingPartyId' => $CDR->BillingPartyId, 'ENUMtld' => $CDR->ENUMtld, 'RatingTables' => $this->CDRS->RatingTables, 'application' => $application ); $Rate = new Rate($this->settings, $this->db); $_maxduration = round($Rate->MaxSessionTime($RateDictionary)); $log = sprintf( "Maximum duration for new session %s of %s to destination %s having balance=%s is %s", $CDR->callId, $CDR->BillingPartyId, $CDR->DestinationId, $this->remaining_balance, $_maxduration ); syslog(LOG_NOTICE, $log); if ($_maxduration > 0) { $this->parallel_calls[$CDR->callId] = array( 'remainingBalancePerSecond' => $this->remaining_balance / $_maxduration ); } else { $log = sprintf( "Maximum duration for new session %s of %s <=0", $CDR->callId, $CDR->BillingPartyId ); syslog(LOG_NOTICE, $log); $ret="0"."\n"."type=prepaid"; return $ret; } $this->parallel_calls[$CDR->callId]=array('remainingBalancePerSecond' => $this->remaining_balance/$_maxduration); $maxduration=$this->getAggregatedMaxSessiontime($this->parallel_calls, $this->remaining_balance, $CDR->BillingPartyId); } else { $RateDictionary=array( 'duration' => $CDR->duration, 'callId' => $CDR->callId, 'Balance' => $current_balance, 'timestamp' => $CDR->timestamp, 'DestinationId' => $CDR->DestinationId, 'region' => $CDR->region, 'domain' => $CDR->domain, 'gateway' => $CDR->gateway, 'BillingPartyId' => $CDR->BillingPartyId, 'ENUMtld' => $CDR->ENUMtld, 'RatingTables' => $this->CDRS->RatingTables, 'application' => $application ); $Rate = new Rate($this->settings, $this->db); $this->runtime['instantiate_rate']=microtime_float(); $maxduration = round($Rate->MaxSessionTime($RateDictionary)); } // add new active session $active_sessions[$CDR->callId] = array( 'timestamp' => $CDR->timestamp, 'duration' => $CDR->duration, 'BillingPartyId' => $CDR->BillingPartyId, 'MaxSessionTime' => $maxduration, 'domain' => $CDR->domain, 'gateway' => $CDR->gateway, 'Destination' => $CDR->destinationPrint, 'DestinationId' => $CDR->DestinationId, 'region' => $CDR->region, 'connectCost' => $Rate->connectCost ); if ($CDR->ENUMtld) { $active_sessions[$CDR->callId]['ENUMtld']=$CDR->ENUMtld; } $this->runtime['calculate_maxduration']=microtime_float(); if ($maxduration < 0) { $log = sprintf( "Error: maxduration %s is negative", $maxduration ); syslog(LOG_NOTICE, $log); $ret = $log."\n"."type=prepaid"; return $ret; } if ($Rate->min_duration && $maxduration < $Rate->min_duration) { $log = sprintf( "Notice: maxduration of %s is less then min_duration (%s)", $maxduration, $Rate->min_duration ); syslog(LOG_NOTICE, $log); $ret = "0"."\n"."type=prepaid"; return $ret; } if (!$Rate->billingTimezone) { $log = sprintf("Error: cannot figure out the billing timezone")."\n"."type=prepaid"; syslog(LOG_NOTICE, $log); $ret=$log."\n"."type=prepaid"; return $ret; } if (!$Rate->startTimeBilling) { $log = sprintf("Error: cannot figure out the billing start time")."\n"."type=prepaid"; syslog(LOG_NOTICE, $log); $ret = $log."\n"."type=prepaid"; return $ret; } $log = sprintf( "MaxSessionTime=%s Type=prepaid CallId=%s BillingParty=%s DestId=%s Balance=%s Spans=%d Counter=%d->%d", $maxduration, $NetFields['callid'], $CDR->BillingPartyId, $CDR->DestinationId, $RateDictionary['Balance'], $Rate->MaxSessionTimeSpans, $old_session_counter, count($active_sessions) ); syslog(LOG_NOTICE, $log); if ($maxduration > 0) { $query = sprintf( "update %s set active_sessions = '%s', session_counter = '%s' where account = '%s'", addslashes($this->prepaid_table), addslashes(json_encode($active_sessions)), count($active_sessions), addslashes($CDR->BillingPartyId) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); $log= sprintf( "Error: database error %s (%s)", $this->db->Error, $this->db->Errno ); return $log; } } $this->runtime['update_prepaid']=microtime_float(); $this->logRuntime(); $ret=$maxduration."\n"."type=prepaid"; return $ret; } elseif ($NetFields['action'] == "dumpprepaidsessions") { if (!$NetFields['account']) { $log = "Error: missing account parameter"; syslog(LOG_NOTICE, $log); return $log; } $query = sprintf( "select * from %s where account = '%s'", addslashes($this->prepaid_table), addslashes($NetFields['account']) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); $this->logRuntime(); return 0; } if (!$this->db->num_rows()) { $log = sprintf("DebitBalanceAudio() Error: account %s does not exist", $account); syslog(LOG_NOTICE, $log); $this->logRuntime(); return 0; } $this->db->next_record(); return var_export(json_decode($this->db->f('active_sessions'), true), true); } elseif ($NetFields['action'] == "debitbalance") { if (!$NetFields['from']) { $log = "Error: missing From parameter"; syslog(LOG_NOTICE, $log); return $log; } if (!$NetFields['to']) { $log = "Error: missing To parameter"; syslog(LOG_NOTICE, $log); return $log; } $app_prefix = preg_replace('/[.].*$/', '', $NetFields['application']); if (!strlen($app_prefix) || (strlen($app_prefix) && $app_prefix == 'audio')) { if (!strlen($NetFields['duration'])) { $log= "Error: missing Duration parameter"; syslog(LOG_NOTICE, $log); return $log; } } if (strlen($app_prefix)) { if ($app_prefix == 'audio' || $app_prefix == 'sms') { $application = $NetFields['application']; } else { $log = sprintf("Error: unsupported application %s", $NetFields['application']); syslog(LOG_NOTICE, $log); return $log; } } else { $application = 'audio'; $app_prefix = 'audio'; } if (!$NetFields['gateway']) { $log = "Error: missing gateway parameter"; syslog(LOG_NOTICE, $log); return $log; } if (!$NetFields['callid']) { $log = "Error: missing Call Id parameter"; syslog(LOG_NOTICE, $log); return $log; } if ($NetFields['force']) { $force = true; } else { $force = false; } $timestamp = time(); list($username_t, $domain_t) = explode("@", $NetFields['from']); $CDRStructure = array( $this->CDRS->CDRFields['callId'] => $NetFields['callid'], $this->CDRS->CDRFields['aNumber'] => $NetFields['from'], $this->CDRS->CDRFields['CanonicalURI'] => $NetFields['to'], $this->CDRS->CDRFields['gateway'] => $NetFields['gateway'], $this->CDRS->CDRFields['ENUMtld'] => $NetFields['enumtld'], $this->CDRS->CDRFields['duration'] => floor($NetFields['duration']), $this->CDRS->CDRFields['timestamp'] => time(), $this->CDRS->CDRFields['domain'] => $domain_t, $this->CDRS->CDRFields['application'] => $application, 'skip_fix_prepaid_duration' => true ); // Init CDR $CDR = new $this->CDRS->CDR_class($this->CDRS, $CDRStructure); $CDR->normalize(); $this->runtime['normalize_cdr']=microtime_float(); // Build Rate dictionary containing normalized CDR fields plus customer Balance $RateDictionary = array( 'callId' => $NetFields['callid'], 'timestamp' => $CDR->timestamp, 'duration' => $CDR->duration, 'DestinationId' => $CDR->DestinationId, 'region' => $CDR->region, 'domain' => $CDR->domain, 'gateway' => $CDR->gateway, 'BillingPartyId' => $CDR->BillingPartyId, 'ENUMtld' => $CDR->ENUMtld, 'RatingTables' => $this->CDRS->RatingTables, 'application' => $application ); $Rate = new Rate($this->settings, $this->db); $this->runtime['instantiate_rate']=microtime_float(); if ($app_prefix == 'audio') { if ($Rate->calculateAudio($RateDictionary)) { $this->runtime['calculate_rate'] = microtime_float(); $this->sessionDoesNotExist = false; $result = $this->DebitBalanceAudio( $CDR->BillingPartyId, $Rate->price, $NetFields['callid'], $CDR->duration, $force ); if ($this->sessionDoesNotExist) { return "Failed"; } $this->runtime['debit_balance']=microtime_float(); $log = sprintf( "DebitBalance=%s Duration=%s CallId=%s BillingParty=%s DestId=%s MaxSessionTime=%d Counter=%d->%d", $Rate->price, $CDR->duration, $NetFields['callid'], $CDR->BillingPartyId, $CDR->DestinationId, $result, $this->old_session_count, $this->new_session_count ); syslog(LOG_NOTICE, $log); $RateReturn = "Ok"; $RateReturn.= sprintf("\nMaxSessionTime=%d", $result); if (strlen($Rate->price)) { $RateReturn.="\n".$Rate->price; if ($Rate->rateInfo) { $RateReturn.="\n".trim($Rate->rateInfo); } } return $RateReturn; } else { syslog(LOG_NOTICE, 'Failed to calculate rate in DebitBalance()'); return "Failed\n"; } } elseif ($app_prefix == 'sms') { // return Ok, No credit, Error if ($Rate->calculateMessage($RateDictionary)) { if ($this->DebitBalanceMessage($CDR->BillingPartyId, $CDR->destinationPrint, $Rate->price, $NetFields['callid'])) { $log = sprintf( "Price=%s CallId=%s BillingParty=%s DestId=%s Application=%s", $Rate->price, $NetFields['callid'], $CDR->BillingPartyId, $CDR->DestinationId, $application ); syslog(LOG_NOTICE, $log); $RateReturn = "Ok"; if (strlen($Rate->price)) { $RateReturn.="\n".$Rate->price; if ($Rate->rateInfo) { $RateReturn.="\n".trim($Rate->rateInfo); } } return $RateReturn; } else { return "Failed"; } } else { return "Failed"; } } else { return false; } } elseif ($NetFields['action'] == "addbalance") { if (!$NetFields['from']) { $log = "Error: Missing From parameter"; syslog(LOG_NOTICE, $log); return 0; } if (!is_numeric($NetFields['value'])) { $log = "Error: Missing Value parameter, it must be numeric"; syslog(LOG_NOTICE, $log); return 0; } return $this->CreditBalance($NetFields['from'], $NetFields['value']); } elseif ($NetFields['action'] == "deletebalance") { if (!$NetFields['from']) { $log = "Error: Missing From parameter"; syslog(LOG_NOTICE, $log); return 0; } return $this->DeleteBalance($NetFields['from']); } elseif ($NetFields['action'] == "deletebalancehistory") { if (!$NetFields['from']) { $log = "Error: Missing From parameter"; syslog(LOG_NOTICE, $log); return 0; } return $this->DeleteBalanceHistory($NetFields['from']); } elseif ($NetFields['action'] == "showprice") { if (!$NetFields['from']) { $log = "Error: Missing From parameter"; syslog(LOG_NOTICE, $log); return 0; } if (!$NetFields['to']) { $log = "Error: Missing To parameter"; syslog(LOG_NOTICE, $log); return 0; } if (!strlen($NetFields['duration'])) { $log = "Error: Missing Duration parameter"; syslog(LOG_NOTICE, $log); return 0; } if ($NetFields['timestamp']) { $timestamp = $NetFields['timestamp']; } else { $timestamp = time(); } if (!$NetFields['gateway']) { $log = "Error: missing gateway parameter"; syslog(LOG_NOTICE, $log); return $log; } $app_prefix = preg_replace('/[.].*$/', '', $NetFields['application']); if (strlen($app_prefix)) { if ($app_prefix == 'audio' || $app_prefix == 'sms') { $application = $NetFields['application']; } else { $log = sprintf("Error: unsupported application %s", $NetFields['application']); syslog(LOG_NOTICE, $log); return $log; } } else { $application = 'audio'; } list($username_t, $domain_t) = explode("@", $NetFields['from']); $CDRStructure=array ( $this->CDRS->CDRFields['callId'] => $NetFields['callid'], $this->CDRS->CDRFields['aNumber'] => $NetFields['from'], $this->CDRS->CDRFields['CanonicalURI'] => $NetFields['to'], $this->CDRS->CDRFields['gateway'] => $NetFields['gateway'], $this->CDRS->CDRFields['ENUMtld'] => $NetFields['enumtld'], $this->CDRS->CDRFields['duration'] => floor($NetFields['duration']), $this->CDRS->CDRFields['timestamp'] => time(), $this->CDRS->CDRFields['domain'] => $domain_t, $this->CDRS->CDRFields['application'] => $application, 'skip_fix_prepaid_duration' => true ); $CDR = new $this->CDRS->CDR_class($this->CDRS, $CDRStructure); $CDR->normalize(); $Rate = new Rate($this->settings, $this->db); $RateDictionary=array( 'callId' => $CDR->callId, 'timestamp' => $CDR->timestamp, 'duration' => $CDR->duration, 'DestinationId' => $CDR->DestinationId, 'region' => $CDR->region, 'domain' => $CDR->domain, 'gateway' => $CDR->gateway, 'BillingPartyId' => $CDR->BillingPartyId, 'ENUMtld' => $CDR->ENUMtld, 'RatingTables' => $this->CDRS->RatingTables, 'application' => $application ); $Rate->calculateAudio($RateDictionary); $this->runtime['calculate_rate'] = microtime_float(); if (strlen($Rate->price)) { $RateReturn=$Rate->price; if ($Rate->rateInfo) { $RateReturn.="\n".trim($Rate->rateInfo); } } else { $RateReturn="0"; } return $RateReturn; } elseif ($NetFields['action'] == "getbalance") { if (!$NetFields['from']) { $log = "Error: Missing From parameter"; syslog(LOG_NOTICE, $log); return 0; } $query = sprintf( "select * from %s where account = '%s'", addslashes($this->prepaid_table), addslashes($NetFields['from']) ); if (!$this->db->query($query)) { $log = sprintf( "Database error for %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); $this->logRuntime(); return 0; } if ($this->db->num_rows()) { $this->db->next_record(); return number_format($this->db->f('balance'), 4, ".", ""); } else { return sprintf("%0.4f", 0); } } elseif ($NetFields['action'] == "getbalancehistory") { if (!$NetFields['from']) { $log = "Error: Missing From parameter"; syslog(LOG_NOTICE, $log); return 0; } $history=$this->getBalanceHistory($NetFields['from']); return trim($history); } elseif ($NetFields['action'] == "getentityprofiles") { if (!$NetFields['entity']) { $log = "Error: Missing Entity parameter"; syslog(LOG_NOTICE, $log); return 0; } $entity=$this->GetEntityProfiles($NetFields['entity']); return trim($entity); } elseif ($NetFields['action'] == "showprofiles") { return trim($this->CDRS->RatingTables->showProfiles()); } elseif ($NetFields['action'] == "showenumtlds") { return trim($this->CDRS->RatingTables->showENUMtlds()); } elseif ($NetFields['action'] == "version") { $version_file=$this->CDRS->CDRTool['Path']."/version"; $version="CDRTool version ".trim(file_get_contents($version_file)); return $version; } elseif ($NetFields['action'] == "help") { return $this->showHelp(); } elseif ($NetFields['action'] == "reloadratingtables") { return $this->reloadRatingTables(); } elseif ($NetFields['action'] == "keepalive") { return $this->keepAlive(); } elseif ($NetFields['action'] == "reloadquota") { if (!$NetFields['account']) { $log = "Error: Missing Account parameter"; syslog(LOG_NOTICE, $log); return 0; } return $this->reloadQuota($NetFields['account']); } elseif ($NetFields['action'] == "reloaddomains") { return $this->CDRS->LoadDomains(); } elseif ($NetFields['action'] == "reloadcustomers") { if ($NetFields['customer'] && $NetFields['type']) { $_customerFilter = array( 'customer' => $NetFields['customer'], 'type' => $NetFields['type'] ); } return $this->reloadCustomers($_customerFilter); } else { $log = "Error: Invalid request"; syslog(LOG_NOTICE, $log); return 0; } } function getQuota($account) { if (!$account) return; list($username, $domain) = explode("@", $account); if ($this->enableThor) { $query = sprintf( "select * from sip_accounts where username = '%s' and domain = '%s'", addslashes($username), addslashes($domain) ); if (!$this->AccountsDB->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->AccountsDB->Error, $this->AccountsDB->Errno ); syslog(LOG_NOTICE, $log); return 0; } if ($this->AccountsDB->num_rows()) { $this->AccountsDB->next_record(); $_profile=json_decode(trim($this->AccountsDB->f('profile'))); return $_profile->quota; } else { return 0; } } else { $query = sprintf( "select quota from subscriber where username = '%s' and domain = '%s'", addslashes($username), addslashes($domain) ); if (!$this->AccountsDB->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->AccountsDB->Error, $this->AccountsDB->Errno ); syslog(LOG_NOTICE, $log); return 0; } if ($this->AccountsDB->num_rows()) { $this->AccountsDB->next_record(); return $this->AccountsDB->f('quota'); } else { return 0; } } } function getBlockedByQuotaStatus($account) { if (!$account) return 0; list($username, $domain) = explode("@", $account); if ($this->enableThor) { $query = sprintf( "select * from sip_accounts where username = '%s' and domain = '%s'", addslashes($username), addslashes($domain) ); if (!$this->AccountsDB->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->AccountsDB->Error, $this->AccountsDB->Errno ); syslog(LOG_NOTICE, $log); return 0; } if ($this->AccountsDB->num_rows()) { $this->AccountsDB->next_record(); $_profile = json_decode(trim($this->AccountsDB->f('profile'))); if (in_array('quota', $_profile->groups)) { return 1; } else { return 0; } } else { return 0; } } else { $query = sprintf( "select CONCAT(username,'@',domain) as account from grp where grp = 'quota' and username = '%s' and domain = '%s'", addslashes($username), addslashes($domain) ); if (!$this->AccountsDB->query($query)) { $log = sprintf( "Database error for query %s: %s (%s)", $query, $this->AccountsDB->Error, $this->AccountsDB->Errno ); syslog(LOG_NOTICE, $log); return 0; } if ($this->AccountsDB->num_rows()) { return 1; } else { return 0; } } return 0; } function getActivePrepaidSessions($active_sessions, $current_balance, $BillingPartyId, $exceptSessions = array()) { $this->parallel_calls=array(); $this->remaining_balance=$current_balance; $ongoing_rates=array(); foreach (array_keys($active_sessions) as $_session) { if (in_array($_session, $exceptSessions)) { /* $log = sprintf ("Ongoing prepaid session %s for %s updated", $_session, $BillingPartyId ); syslog(LOG_NOTICE, $log); */ continue; } $Rate_session = new Rate($this->settings, $this->db); $passed_time = time() - $active_sessions[$_session]['timestamp']; $active_sessions[$_session]['passed_time'] = $passed_time; $RateDictionary_session = array( 'duration' => $passed_time, 'callId' => $_session, 'timestamp' => $active_sessions[$_session]['timestamp'], 'DestinationId' => $active_sessions[$_session]['DestinationId'], 'region' => $active_sessions[$_session]['region'], 'domain' => $active_sessions[$_session]['domain'], 'BillingPartyId' => $active_sessions[$_session]['BillingPartyId'], 'ENUMtld' => $active_sessions[$_session]['ENUMtld'], 'RatingTables' => $this->CDRS->RatingTables ); $Rate_session->calculateAudio($RateDictionary_session); $log = sprintf( "Active sessions %s for %s to %s: duration=%s, price=%s ", $_session, $BillingPartyId, $active_sessions[$_session]['Destination'], $passed_time, $Rate_session->price ); syslog(LOG_NOTICE, $log); $ongoing_rates[$_session] = array( 'duration' => $passed_time, 'price' => $Rate_session->price ); } if (count($ongoing_rates)) { // calculate the virtual balance of the user at this moment in time $due_balance=0; foreach (array_keys($ongoing_rates) as $_o) { $due_balance = $due_balance + $ongoing_rates[$_o]['price']; } $this->remaining_balance = $this->remaining_balance-$due_balance; $log = sprintf( "Balance for %s having %d active sessions: database=%s, due=%s, real=%s", $BillingPartyId, count($ongoing_rates), sprintf("%0.4f", $current_balance), sprintf("%0.4f", $due_balance), sprintf("%0.4f", $this->remaining_balance) ); syslog(LOG_NOTICE, $log); } foreach (array_keys($active_sessions) as $_session) { if (in_array($_session, $exceptSessions)) { continue; } $RateDictionary_session = array( 'callId' => $_session, 'timestamp' => time(), 'Balance' => $this->remaining_balance, 'DestinationId' => $active_sessions[$_session]['DestinationId'], 'region' => $active_sessions[$_session]['region'], 'domain' => $active_sessions[$_session]['domain'], 'BillingPartyId' => $active_sessions[$_session]['BillingPartyId'], 'ENUMtld' => $active_sessions[$_session]['ENUMtld'], 'RatingTables' => $this->CDRS->RatingTables, 'skipConnectCost' => true ); if ($active_sessions[$_session]['duration']) { $RateDictionary_session['duration'] = $active_sessions[$_session]['duration']-$active_sessions[$_session]['passed_time']; } $Rate = new Rate($this->settings, $this->db); $_maxduration = round($Rate->MaxSessionTime($RateDictionary_session)); $log = sprintf( "Remaining duration for active session %s of %s to destination %s having balance=%s is %s", $_session, $BillingPartyId, $active_sessions[$_session]['DestinationId'], $this->remaining_balance, $_maxduration ); syslog(LOG_NOTICE, $log); if ($_maxduration > 0) { $this->parallel_calls[$_session] = array( 'remainingBalancePerSecond' => $this->remaining_balance / $_maxduration ); } else { /* $log = sprintf ("Maxduration for session %s of %s will be negative",$_session,$active_sessions[$_session]['BillingPartyId']); syslog(LOG_NOTICE, $log); */ } } return 1; } function getAggregatedMaxSessiontime($parallel_calls = array(), $balance, $BillingPartyId) { $maxduration=0; $sum_remaining_balance_per_second=0; foreach (array_keys($parallel_calls) as $_call) { $sum_remaining_balance_per_second = $sum_remaining_balance_per_second + $parallel_calls[$_call]['remainingBalancePerSecond']; } if ($sum_remaining_balance_per_second > 0) { $maxduration = intval($balance / $sum_remaining_balance_per_second); if (count($parallel_calls) > 1) { $log = sprintf("Maximum agregated duration for %s is %s", $BillingPartyId, $maxduration); syslog(LOG_NOTICE, $log); } } else { /* $log = sprintf ("Error: sum_remaining_balance_per_second for %s is negative",$BillingPartyId); syslog(LOG_NOTICE, $log); */ $maxduration = 0; } return round($maxduration); } function keepAlive() { $query = sprintf("select * from auth_user"); if (!$this->db->query($query) || !$this->db->num_rows()) { $log = sprintf( "Database error for keepalive query %s: %s (%s)", $query, $this->db->Error, $this->db->Errno ); syslog(LOG_NOTICE, $log); return false; } $log = sprintf("Keepalive successful"); syslog(LOG_NOTICE, $log); return true; } } function reloadRatingEngineTables() { global $RatingEngine; global $DATASOURCES; if (strlen($RatingEngine['socketIP']) && $RatingEngine['socketPort']) { if ($RatingEngine['socketIP']=='0.0.0.0' || $RatingEngine['socketIP'] == '0') { $RatingEngine['socketIPforClients']= '127.0.0.1'; } else { $RatingEngine['socketIPforClients']=$RatingEngine['socketIP']; } // init CDR datasource $CDR_class = $DATASOURCES[$RatingEngine['cdr_source']]['class']; $CDRS = new $CDR_class($RatingEngine['cdr_source']); $CDRS->CacheDestinations(); if ($fp = fsockopen($RatingEngine['socketIPforClients'], $RatingEngine['socketPort'], $errno, $errstr, 2)) { fputs($fp, "ReloadRatingTables\n"); fclose($fp); return true; } } return false; } function keepAliveRatingEngine() { global $RatingEngine; if (strlen($RatingEngine['socketIP']) && $RatingEngine['socketPort']) { if ($RatingEngine['socketIP']=='0.0.0.0' || $RatingEngine['socketIP'] == '0') { $RatingEngine['socketIPforClients']= '127.0.0.1'; } else { $RatingEngine['socketIPforClients']=$RatingEngine['socketIP']; } if ($fp = fsockopen($RatingEngine['socketIPforClients'], $RatingEngine['socketPort'], $errno, $errstr, 2)) { fputs($fp, "KeepAlive\n"); fclose($fp); return true; } } return false; } function testRatingTables() { global $RatingEngine; if (!strlen($RatingEngine['socketIP']) || !$RatingEngine['socketPort']) { return false; } if ($RatingEngine['socketIP']=='0.0.0.0' || $RatingEngine['socketIP'] == '0') { $RatingEngine['socketIPforClients']= '127.0.0.1'; } else { $RatingEngine['socketIPforClients']=$RatingEngine['socketIP']; } $i=0; $b=time(); while ($i < 1000) { if (!$fp = fsockopen($RatingEngine['socketIPforClients'], $RatingEngine['socketPort'], $errno, $errstr, 2)) { print "Error connecting to rating engine\n"; break; } $i++; $number='00'.RandomNumber(1, true).RandomNumber(12).'@example.com'; $duration=RandomNumber(3, true); $command = sprintf( "ShowPrice From=sip:123@example.com To=sip:%s Gateway=10.0.0.1 Duration=%d\n", $number, $duration ); fputs($fp, $command, strlen($command)); $response = fgets($fp, 8192); fclose($fp); } $e = time(); $d = $e - $b; if ($d) { printf("Commands=%d, Time=%s seconds, Speed=%s cps\n", $i, $d, number_format($i / $d, 1)); } } ?> diff --git a/library/sip_settings.php b/library/sip_settings.php index 48a5aa7..54208a3 100644 --- a/library/sip_settings.php +++ b/library/sip_settings.php @@ -1,12977 +1,12977 @@ "; var $billing_email = "Billing "; var $sip_settings_page = "https://cdrtool.example.com/sip_settings.phtml"; var $xcap_root = "https://cdrtool.example.com/xcap-root"; var $pstn_access = false; var $sms_access = false; var $pstn_changes_allowed = false; var $prepaid_changes_allowed = false; var $sip_proxy = "proxy.example.com"; var $sip_outbound_proxy = ""; var $sip_mobile_outbound_proxy = ""; var $voicemail_server = "vm.example.com"; var $absolute_voicemail_uri = false; // use var $enable_thor = false; var $currency = "€"; // access numbers var $voicemail_access_number = "1233"; var $FUNC_access_number = "*21*"; var $FNOL_access_number = "*22*"; var $FNOA_access_number = "*23*"; var $FBUS_access_number = "*23*"; var $change_privacy_access_number = "*67"; var $check_privacy_access_number = "*68"; var $reject_anonymous_access_number = "*69"; var $show_barring_tab = false; var $show_payments_tab = false; var $show_tls_section = false; var $show_support_tab = false; var $show_did_tab = false; var $show_directory = false; var $notify_on_sip_account_changes = false; var $first_tab = 'calls'; var $auto_refesh_tab = 0; // number of seconds after which to refresh tab content in the web browser var $payment_processor_class = false; var $did_processor_class = false; var $show_download_tab = 'Blink'; // set it to name of the tab or false to disable it var $digest_settings_page = "https://blink.sipthor.net/settings.phtml"; // end variables var $tab = "settings"; var $phonebook_img = ""; var $call_img = "

"; var $delete_img = "Delete"; var $plus_sign_img = "Add Contact"; var $embedded_img = ""; var $groups = array(); var $form_elements = array( 'mailto', 'free-pstn', 'blocked', 'sip_password', 'web_password', 'yubikey', 'first_name', 'last_name', 'quota', 'language', 'quota_deblock', 'voicemail', 'anonymous', 'advanced', 'rpid', 'timezone', 'accept', 'accept_temporary_group', 'accept_temporary_remain', 'web_timestamp', 'web_password_reset', 'acceptDailyStartTime', 'acceptDailyStopTime', 'acceptDailyGroup', 'quickdial', 'delete_voicemail', 'voicemail_password', 'region', 'timeout', 'owner', 'mobile_number', 'extra_groups', 'show_barring_tab', 'ip_access_list', 'callLimit' ); var $disable_extra_groups=true; var $prepaid = 0; var $emergency_regions = array(); var $FNOA_timeoutDefault = 35; var $enums = array(); var $barring_prefixes = array(); var $SipUAImagesPath = "images"; var $SipUAImagesFile = "phone_images.php"; var $balance_history = array(); var $enrollment_url = false; var $sip_settings_api_url= false; var $journalEntries = array(); var $chat_replication_backend = 'mysql'; var $owner_information =array(); var $languages=array("en"=>array('name'=>"English", 'timezone'=>'' ), "ro"=>array('name'=>"Română", 'timezone' => 'Europe/Bucharest' ), "nl"=>array('name'=>"Nederlands", 'timezone' => 'Europe/Amsterdam' ), "es"=>array('name'=>"Español", 'timezone' => 'Europe/Madrid' ), "de"=>array('name'=>"Deutsch", 'timezone' => 'Europe/Berlin' ) ); var $pstn_termination_price_page = 'sip_rates_body.html'; var $append_domain_to_xcap_root = false; var $blink_download_url = "https://blink.sipthor.net/download.phtml?download"; var $ownerCredentials = array(); var $localGroups = array(); var $max_credit_per_day = 40; var $enrollment_configuration = "/etc/cdrtool/enrollment/config.ini"; var $require_proof_of_identity = true; var $call_limit_may_by_changed_by = 'reseller'; #subscriber, reseller, admin var $ip_access_list_may_by_changed_by = 'reseller'; #subscriber, reseller, admin var $create_certificate = false; function SipSettings($account,$loginCredentials=array(),$soapEngines=array()) { //define_syslog_variables(); $this->platform_call_limit = _('unlimited'); $this->soapEngines = $soapEngines; $debug=sprintf("

Initialize %s(%s)",get_class($this),$account); dprint($debug); //dprint_r($loginCredentials); $this->loginCredentials = &$loginCredentials; if ($this->isEmbedded()) { $this->login_type = 'subscriber'; } else { if ($loginCredentials['login_type']) { $this->login_type = $loginCredentials['login_type']; } else { $this->login_type = 'subscriber'; } } $this->reseller = $loginCredentials['reseller']; $this->customer = $loginCredentials['customer']; if (strlen($loginCredentials['sip_engine'])) { $this->sip_engine=$loginCredentials['sip_engine']; } else { print _("Error: missing sip_engine in login credentials"); return false; } $this->settingsPage = $_SERVER['PHP_SELF']; if ($_REQUEST['tab']) { $this->tab = $_REQUEST['tab']; } else { $this->tab = $this->first_tab; } $this->initSoapClient(); $this->getAccount($account); if ($this->tab=='calls' && !$_REQUEST['export']) { $this->auto_refesh_tab=180; } $this->admin_url = $this->settingsPage."?account=$this->account&adminonly=1&reseller=$this->reseller&sip_engine=$this->sip_engine"; $this->reseller_url = $this->settingsPage."?account=$this->account&reseller=$this->reseller&sip_engine=$this->sip_engine"; $this->admin_url_absolute = $this->sip_settings_page."?account=$this->account&adminonly=1&reseller=$this->reseller&sip_engine=$this->sip_engine"; if ($this->login_type == "admin") { $this->url=$this->admin_url; $this->hiddenElements=" account\"> reseller> sip_engine> "; } else if ($this->login_type == "reseller" || $this->login_type == "customer") { $this->url=$this->reseller_url; $this->hiddenElements=" account\"> reseller> sip_engine> "; } else { $this->url=$this->settingsPage; if (!$this->isEmbedded()) { $this->url.="?account=$this->account"; } else { $this->url.=sprintf("?1=1&realm=%s",urlencode($_REQUEST['realm'])); if ($_REQUEST['user_agent']) { $this->url.=sprintf("&user_agent=%s",urlencode($_REQUEST['user_agent'])); } } $this->hiddenElements=sprintf(" ", $this->account, $this->sip_engine, $_REQUEST['user_agent'], $_REQUEST['realm'] ); } $this->setLanguage(); if (!$this->username) { dprint ("Record not found."); return false; } $this->availableGroups['blocked'] = array("Group"=>"blocked", "WEBName" =>sprintf(_("Status")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>0, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); $this->availableGroups['trunking'] = array("Group"=>"trunking", "WEBName" =>sprintf(_("Trunking")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>0, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); $this->availableGroups['deny-password-change'] = array("Group"=>"deny-password-change", "WEBName" =>sprintf(_("Deny password change")), "SubscriberMayEditIt"=>0, "SubscriberMaySeeIt"=>0, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); $this->getResellerSettings(); $this->getCustomerSettings(); if ($this->reject_anonymous_access_number) { $_comment = sprintf(_("Dial %s to change"), $this->reject_anonymous_access_number); } else { $_comment = ''; } $this->availableGroups['anonymous-reject']=array("Group"=>$this->anonymous-reject, "WEBName" =>sprintf (_("Reject Anonymous")), "WEBComment"=>$_comment, "SubscriberMaySeeIt"=>1, "SubscriberMayEditIt"=>1, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); $this->availableGroups['missed-calls']=array("Group"=>'missed-calls', "WEBName" =>sprintf (_("Email Missed Calls")), "WEBComment"=>'', "SubscriberMaySeeIt"=>1, "SubscriberMayEditIt"=>1, "ResellerMayEditIt"=>1, "ResellerMaySeeIt"=>1 ); $this->availableGroups=array_merge($this->availableGroups, $this->localGroups); $this->pstnChangesAllowed(); $this->smsChangesAllowed(); $this->prepaidChangesAllowed(); $this->tabs=array('identity'=>_('Identity'), 'devices'=>_('Devices'), 'settings'=>_('Settings'), 'calls'=>_('History'), ); if (!in_array("trunking",$this->groups)) { $this->tabs['diversions']=_('Forwarding'); $this->tabs['accept']=_('Accept'); $this->tabs['contacts']=_('Contacts'); } if (in_array("free-pstn",$this->groups)) { if ($this->show_barring_tab || $this->Preferences['show_barring_tab']) { $this->tabs['barring']=_("Barring"); } } if ($this->show_did_tab && !in_array("trunking",$this->groups)) { $this->tabs['did']=_("DID"); } if (!$this->isEmbedded() && $this->show_download_tab && !in_array("trunking",$this->groups)) { $this->tabs['download'] = $this->show_download_tab; } $this->acceptDailyProfiles=array('127' => _('Every day'), '31' => _('Weekday'), '96' => _('Weekend'), '1' => _('Monday'), '2' => _('Tuesday'), '4' => _('Wednesday'), '8' => _('Thursday'), '16' => _('Friday'), '32' => _('Saturday'), '64' => _('Sunday') ); $this->PhonebookGroups=array( "vip" =>sprintf(_("VIP")), "business" =>sprintf(_("Business")), "coworkers" =>sprintf(_("Coworkers")), "friends" =>sprintf(_("Friends")), "family" =>sprintf(_("Family")) ); $this->diversionType=array( "FUNC"=>sprintf(_("All Calls")), "FNOL"=>sprintf(_("If Not-Online")), "FBUS"=>sprintf(_("If Busy")), "FNOA"=>sprintf(_("If No-Answer")), "FUNV"=>sprintf(_("If Unavailable")) ); $this->diversionTypeUNV=array( "FUNV"=>sprintf(_("If Unavailable")) ); $this->VoicemaildiversionType=array( "FNOL"=>sprintf(_("If Not-Online")), "FBUS"=>sprintf(_("If Busy")), "FNOA"=>sprintf(_("If No-Answer")), "FUNV"=>sprintf(_("If Unavailable")) ); $this->access_numbers=array("FUNC"=>$this->FUNC_access_number, "FNOA"=>$this->FNOA_access_number, "FBUS"=>$this->FBUS_access_number, "FNOL"=>$this->FNOL_access_number ); if ($this->prepaid && $this->pstn_access) { $this->tabs['credit']=_("Credit"); } $_protocol=preg_match("/^(https?:\/\/)/",$_SERVER['SCRIPT_URI'],$m); $this->absolute_url=$m[1].$_SERVER['HTTP_HOST'].$this->url; if ($this->prepaid && $this->show_payments_tab) { $this->tabs['payments']=_("Payments"); } if ($this->show_support_tab) { $this->tabs['support'] = 'Support'; } } function initSoapClient() { dprint("initSoapClient()"); // Sip, Voicemail and Customer ports share same login $this->SOAPurl=$this->soapEngines[$this->sip_engine]['url']; $this->SOAPversion=$this->soapEngines[$this->sip_engine]['version']; if ($this->soapEngines[$this->sip_engine]['enrollment_url']) { $this->enrollment_url =$this->soapEngines[$this->sip_engine]['enrollment_url']; } if ($this->soapEngines[$this->sip_engine]['chat_replication_backend']) { $this->chat_replication_backend = $this->soapEngines[$this->sip_engine]['chat_replication_backend']; } if ($this->soapEngines[$this->sip_engine]['sip_settings_api_url']) { $this->sip_settings_api_url =$this->soapEngines[$this->sip_engine]['sip_settings_api_url']; } if (strlen($this->loginCredentials['soapUsername'])) { $this->SOAPlogin = array( "username" => $this->loginCredentials['soapUsername'], "password" => $this->loginCredentials['soapPassword'], "admin" => false ); $this->soapUsername = $this->loginCredentials['soapUsername']; } else { $this->SOAPlogin = array( "username" => $this->soapEngines[$this->sip_engine]['username'], "password" => $this->soapEngines[$this->sip_engine]['password'], "admin" => true, "impersonate" => intval($this->customer) ); $this->soapUsername = $this->soapEngines[$this->sip_engine]['username']; } $this->SoapAuth = array('auth', $this->SOAPlogin , 'urn:AGProjects:NGNPro', 0, ''); //print_r($this->SoapAuth); $this->SOAPloginAdmin = array( "username" => $this->soapEngines[$this->sip_engine]['username'], "password" => $this->soapEngines[$this->sip_engine]['password'], "admin" => true ); $this->SoapAuthAdmin = array('auth', $this->SOAPloginAdmin , 'urn:AGProjects:NGNPro', 0, ''); if (strlen($this->loginCredentials['customer_engine'])) { $this->customer_engine=$this->loginCredentials['customer_engine']; } else if (strlen($this->soapEngines[$this->sip_engine]['customer_engine'])) { $this->customer_engine=$this->soapEngines[$this->sip_engine]['customer_engine']; } else { $this->customer_engine=$this->sip_engine; } if (strlen($this->loginCredentials['voicemail_engine'])) { $this->voicemail_engine=$this->loginCredentials['voicemail_engine']; } else if (strlen($this->soapEngines[$this->sip_engine]['voicemail_engine'])) { $this->voicemail_engine=$this->soapEngines[$this->sip_engine]['voicemail_engine']; } else { $this->voicemail_engine=$this->sip_engine; } if (strlen($this->loginCredentials['enum_engine'])) { $this->enum_engine=$this->loginCredentials['enum_engine']; } else if (strlen($this->soapEngines[$this->sip_engine]['enum_engine'])) { $this->enum_engine=$this->soapEngines[$this->sip_engine]['enum_engine']; } else { $this->enum_engine=$this->sip_engine; } if (strlen($this->loginCredentials['rating_engine'])) { $this->rating_engine=$this->loginCredentials['rating_engine']; } else if (strlen($this->soapEngines[$this->sip_engine]['rating_engine'])) { $this->rating_engine=$this->soapEngines[$this->sip_engine]['rating_engine']; } else { $this->rating_engine=$this->sip_engine; } // overwrite default settings if (strlen($this->soapEngines[$this->sip_engine]['sip_proxy'])) { $this->sip_proxy = $this->soapEngines[$this->sip_engine]['sip_proxy']; } if (strlen($this->soapEngines[$this->sip_engine]['sip_outbound_proxy'])) { $this->sip_outbound_proxy = $this->soapEngines[$this->sip_engine]['sip_outbound_proxy']; } if (strlen($this->soapEngines[$this->sip_engine]['support_company'])) { $this->support_company = $this->soapEngines[$this->sip_engine]['support_company']; } if (strlen($this->soapEngines[$this->sip_engine]['support_web'])) { $this->support_web = $this->soapEngines[$this->sip_engine]['support_web']; } if (strlen($this->soapEngines[$this->sip_engine]['support_email'])) { $this->support_email = $this->soapEngines[$this->sip_engine]['support_email']; } if (strlen($this->soapEngines[$this->sip_engine]['billing_email'])) { $this->billing_email = $this->soapEngines[$this->sip_engine]['billing_email']; } if (strlen($this->soapEngines[$this->sip_engine]['sip_settings_page'])) { $this->sip_settings_page = $this->soapEngines[$this->sip_engine]['sip_settings_page']; } if (strlen($this->soapEngines[$this->sip_engine]['digest_settings_page'])) { $this->digest_settings_page = $this->soapEngines[$this->sip_engine]['digest_settings_page']; } if (strlen($this->soapEngines[$this->sip_engine]['xcap_root'])) { $this->xcap_root = $this->soapEngines[$this->sip_engine]['xcap_root']; } if (strlen($this->soapEngines[$this->sip_engine]['cdrtool_address'])) { $this->cdrtool_address = $this->soapEngines[$this->sip_engine]['cdrtool_address']; } if (strlen($this->soapEngines[$this->sip_engine]['msrp_relay'])) { $this->msrp_relay = $this->soapEngines[$this->sip_engine]['msrp_relay']; } if ($this->soapEngines[$this->sip_engine]['emergency_regions']) { $this->emergency_regions = $this->soapEngines[$this->sip_engine]['emergency_regions']; } if ($this->soapEngines[$this->sip_engine]['pstn_access']) { $this->pstn_access = $this->soapEngines[$this->sip_engine]['pstn_access']; } if ($this->soapEngines[$this->sip_engine]['call_limit']) { $this->platform_call_limit = $this->soapEngines[$this->sip_engine]['call_limit']; } if ($this->soapEngines[$this->sip_engine]['sms_access']) { $this->sms_access = $this->soapEngines[$this->sip_engine]['sms_access']; } if ($this->soapEngines[$this->sip_engine]['voicemail_server']) { $this->voicemail_server = $this->soapEngines[$this->sip_engine]['voicemail_server']; } if ($this->soapEngines[$this->sip_engine]['currency']) { $this->currency = $this->soapEngines[$this->sip_engine]['currency']; } if ($this->soapEngines[$this->sip_engine]['voicemail_access_number']) { $this->voicemail_access_number = $this->soapEngines[$this->sip_engine]['voicemail_access_number']; } if ($this->soapEngines[$this->sip_engine]['FUNC_access_number']) { $this->FUNC_access_number = $this->soapEngines[$this->sip_engine]['FUNC_access_number']; } if ($this->soapEngines[$this->sip_engine]['FNOA_access_number']) { $this->FNOA_access_number = $this->soapEngines[$this->sip_engine]['FNOA_access_number']; } if ($this->soapEngines[$this->sip_engine]['FBUS_access_number']) { $this->FBUS_access_number = $this->soapEngines[$this->sip_engine]['FBUS_access_number']; } if ($this->soapEngines[$this->sip_engine]['FNOL_access_number']) { $this->FNOL_access_number = $this->soapEngines[$this->sip_engine]['FNOL_access_number']; } if ($this->soapEngines[$this->sip_engine]['payment_processor_class']) { $this->payment_processor_class = $this->soapEngines[$this->sip_engine]['payment_processor_class']; } if ($this->soapEngines[$this->sip_engine]['change_privacy_access_number']) { $this->change_privacy_access_number = $this->soapEngines[$this->sip_engine]['change_privacy_access_number']; } if ($this->soapEngines[$this->sip_engine]['check_privacy_access_number']) { $this->check_privacy_access_number = $this->soapEngines[$this->sip_engine]['check_privacy_access_number']; } if ($this->soapEngines[$this->sip_engine]['reject_anonymous_access_number']) { $this->reject_anonymous_access_number = $this->soapEngines[$this->sip_engine]['reject_anonymous_access_number']; } if ($this->soapEngines[$this->sip_engine]['show_directory']) { $this->show_directory = $this->soapEngines[$this->sip_engine]['show_directory']; } if (isset($this->soapEngines[$this->sip_engine]['absolute_voicemail_uri'])) { $this->absolute_voicemail_uri = $this->soapEngines[$this->sip_engine]['absolute_voicemail_uri']; } if (isset($this->soapEngines[$this->sip_engine]['enable_thor'])) { $this->enable_thor=$this->soapEngines[$this->sip_engine]['enable_thor']; } if (isset($this->soapEngines[$this->sip_engine]['sip_accounts_lite'])) { $this->sip_accounts_lite=$this->soapEngines[$this->sip_engine]['sip_accounts_lite']; } if (strlen($this->soapEngines[$this->sip_engine]['timeout'])) { $this->soapTimeout=intval($this->soapEngines[$this->sip_engine]['timeout']); } if (strlen($this->soapEngines[$this->sip_engine]['store_clear_text_passwords'])) { $this->store_clear_text_passwords=$this->soapEngines[$this->sip_engine]['store_clear_text_passwords']; } if (isset($this->soapEngines[$this->sip_engine]['show_download_tab'])) { $this->show_download_tab=$this->soapEngines[$this->sip_engine]['show_download_tab']; } if (strlen($this->soapEngines[$this->sip_engine]['show_barring_tab'])) { $this->show_barring_tab=$this->soapEngines[$this->sip_engine]['show_barring_tab']; } if (isset($this->soapEngines[$this->sip_engine]['disable_extra_groups'])) { $this->disable_extra_groups=$this->soapEngines[$this->sip_engine]['disable_extra_groups']; } if (strlen($this->soapEngines[$this->sip_engine]['notify_on_sip_account_changes'])) { //dprint($this->soapEngines[$this->sip_engine]['notify_on_sip_account_changes']); $this->notify_on_sip_account_changes=$this->soapEngines[$this->sip_engine]['notify_on_sip_account_changes']; } if ($this->loginCredentials['templates_path']) { $this->templates_path = $this->loginCredentials['templates_path']; } else if ($this->soapEngines[$this->sip_engine]['templates_path']) { $this->templates_path = $this->soapEngines[$this->sip_engine]['templates_path']; } // Instantiate the SOAP clients // sip $this->SipPort = new $this->soapClassSipPort($this->SOAPurl); $this->SipPort->_options['timeout'] = $this->soapTimeout; $this->SipPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->SipPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if ($this->showSoapConnectionInfo) { printf ("

%s at %s as %s ",$this->soapClassSipPort,$this->SOAPurl,$this->SOAPurl,$this->soapUsername); } // voicemail $this->SOAPurlVoicemail = $this->soapEngines[$this->voicemail_engine]['url']; $this->SOAPloginVoicemail = array( "username" => $this->soapEngines[$this->voicemail_engine]['username'], "password" => $this->soapEngines[$this->voicemail_engine]['password'], "admin" => true, "impersonate" => intval($this->customer) ); $this->SoapAuthVoicemail = array('auth', $this->SOAPloginVoicemail , 'urn:AGProjects:NGNPro', 0, ''); $this->VoicemailPort = new $this->soapClassVoicemailPort($this->SOAPurlVoicemail); if (strlen($this->soapEngines[$this->voicemail_engine]['timeout'])) { $this->VoicemailPort->_options['timeout'] = intval($this->soapEngines[$this->voicemail_engine]['timeout']); } else { $this->VoicemailPort->_options['timeout'] = $this->soapTimeout; } $this->VoicemailPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->VoicemailPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if ($this->showSoapConnectionInfo && $this->SOAPurlVoicemail != $this->SOAPurl) { printf ("
%s at %s as %s ",$this->soapClassVoicemailPort,$this->SOAPurlVoicemail,$this->SOAPurlVoicemail,$this->soapEngines[$this->voicemail_engine]['username']); } // enum $this->SOAPurlEnum = $this->soapEngines[$this->enum_engine]['url']; $this->SOAPloginEnum = array( "username" => $this->soapEngines[$this->enum_engine]['username'], "password" => $this->soapEngines[$this->enum_engine]['password'], "admin" => true, "impersonate" => intval($this->customer) ); $this->SoapAuthEnum = array('auth', $this->SOAPloginEnum , 'urn:AGProjects:NGNPro', 0, ''); $this->EnumPort = new $this->soapClassEnumPort($this->SOAPurlEnum); if (strlen($this->soapEngines[$this->enum_engine]['timeout'])) { $this->EnumPort->_options['timeout'] = intval($this->soapEngines[$this->enum_engine]['timeout']); } else { $this->EnumPort->_options['timeout'] = $this->soapTimeout; } $this->EnumPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->EnumPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if ($this->showSoapConnectionInfo && $this->SOAPurlEnum != $this->SOAPurl) { printf ("
%s at %s as %s ",$this->soapClassEnumPort,$this->SOAPurlEnum,$this->SOAPurlEnum,$this->soapEngines[$this->enum_engine]['username']); } // rating $this->SOAPurlRating = $this->soapEngines[$this->rating_engine]['url']; $this->SOAPloginRating = array( "username" => $this->soapEngines[$this->rating_engine]['username'], "password" => $this->soapEngines[$this->rating_engine]['password'], "admin" => true, "impersonate" => intval($this->customer) ); $this->SoapAuthRating = array('auth', $this->SOAPloginRating , 'urn:AGProjects:NGNPro', 0, ''); $this->RatingPort = new $this->soapClassRatingPort($this->SOAPurlRating); if (strlen($this->soapEngines[$this->rating_engine]['timeout'])) { $this->RatingPort->_options['timeout'] = intval($this->soapEngines[$this->rating_engine]['timeout']); } else { $this->RatingPort->_options['timeout'] = $this->soapTimeout; } $this->RatingPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->RatingPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if ($this->showSoapConnectionInfo && $this->SOAPurlRating != $this->SOAPurl) { printf ("
%s at %s as %s ",$this->soapClassRatingPort,$this->SOAPurlRating,$this->SOAPurlRating,$this->soapEngines[$this->rating_engine]['username']); } // customer $this->SOAPurlCustomer = $this->soapEngines[$this->customer_engine]['url']; $this->SOAPloginCustomer = array( "username" => $this->soapEngines[$this->customer_engine]['username'], "password" => $this->soapEngines[$this->customer_engine]['password'], "admin" => true ); $this->SoapAuthCustomer = array('auth', $this->SOAPloginCustomer , 'urn:AGProjects:NGNPro', 0, ''); $this->CustomerPort = new $this->soapClassCustomerPort($this->SOAPurlCustomer); if (strlen($this->soapEngines[$this->customer_engine]['timeout'])) { $this->CustomerPort->_options['timeout'] = intval($this->soapEngines[$this->customer_engine]['timeout']); } else { $this->CustomerPort->_options['timeout'] = $this->soapTimeout; } $this->CustomerPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->CustomerPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if ($this->showSoapConnectionInfo && $this->SOAPurlCustomer != $this->SOAPurl) { printf ("
%s at %s as %s ",$this->soapClassCustomerPort,$this->SOAPurlCustomer,$this->SOAPurlCustomer,$this->soapEngines[$this->customer_engine]['username']); } } function getAccount($account) { dprint("getAccount($account, engine=$this->sip_engine)"); list($username,$domain)=explode("@",trim($account)); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getAccount(array("username" =>$username,"domain" =>$domain)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } //print "

";
         dprint_r($result);
         $this->owner     = $result->owner;
 
         if (!is_array($result->properties))   $result->properties=array();
         if (!is_array($result->groups))       $result->groups=array();
 
         if (!$result->quota) $result->quota=0;
 
         foreach ($result->properties as $_property) {
             $this->Preferences[$_property->name]=$_property->value;
         }
 
         //dprint_r($this->Preferences);
 
         if (!$this->Preferences['language']) {
             $this->Preferences['language'] ='en';
         }
 
         if ( $this->Preferences['blocked_by'] && !in_array("blocked",$result->groups)) {
             $this->Preferences['blocked_by']='';
         }
 
         $this->username       = $result->id->username;
         $this->domain         = $result->id->domain;
         $this->password       = $result->password;
         $this->firstName      = $result->firstName;
         $this->lastName       = $result->lastName;
         $this->rpid           = $result->rpid;
         $this->owner          = $result->owner;
         $this->timezone       = $result->timezone;
         $this->email          = $result->email;
         $this->groups         = $result->groups;
         $this->createDate     = $result->createDate;
         $this->web_password   = $this->Preferences['web_password'];
         $this->quickdial      = $result->quickdialPrefix;
         $this->timeout        = intval($result->timeout);
         $this->quota          = $result->quota;
         $this->prepaid        = intval($result->prepaid);
         $this->region         = $result->region;
 
         $this->account        = $this->username."@".$this->domain;
         $this->fullName       = $this->firstName." ".$this->lastName;
         $this->name           = $this->firstName; // used by smarty
 
         $this->yuibikey         = $result->Preferences['yubikey'];
 
         if ($this->soapEngines[$this->sip_engine]['call_limit']) {
             if ($result->callLimit) {
                 $this->callLimit   = $result->callLimit;
             } else  {
                 $this->callLimit = '';
             }
         }
 
         if ($this->soapEngines[$this->sip_engine]['ip_access_list']) {
             if (is_array($result->acl) and count($result->acl)) {
                 foreach (array_keys($result->acl) as $key) {
                     $this->ip_access_list .= sprintf("%s/%s ",$result->acl[$key]->ip, $result->acl[$key]->mask);
                 }
                 $this->ip_access_list = trim($this->ip_access_list);
             } else  {
                 $this->ip_access_list = $this->soapEngines[$this->sip_engine]['ip_access_list'];
             }
         }
 
         $this->sipId=array("username" => $this->username,
                            "domain" => $this->domain
                            );
 
         if (!$this->timeout) {
             $this->timeoutWasNotSet=1;
             $this->timeout=intval($this->FNOA_timeoutDefault);
         }
 
         if ($this->timeout > 900 ) {
             $this->timeoutWasNotSet=1;
             $this->timeout=intval(900);
         }
 
         $this->getOwnerSettings($this->owner);
 
         $this->getDomainOwner($this->domain);
 
         $this->getMobileNumber();
 
         if ($this->append_domain_to_xcap_root) {
             $this->xcap_root     = rtrim($this->xcap_root,'/')."@".$this->domain."/";
         }
 
         $this->result    = $result;
 
     }
 
     function showAccount() {
         dprint('showAccount()');
 
         if (!$this->account) {
             print "
"; print _("Error: SIP Account information cannot be retrieved. "); return 0; print "

"; print _("You must set the Owner to enable Credit Card Payments. "); print "

"; if ($account->login_type!='subscriber') { print "

"; printf ("Daily Credit Exceeded"); } else { print _("Page Not Available"); $log=sprintf("CC transaction is not allowed from %s for %s (%s)",$_SERVER['REMOTE_ADDR'],$account->account,$this->fraud_reason); syslog(LOG_NOTICE, $log); } print "

"; print "

"; printf (_("Calling to telephone numbers is possible at the costs set forth in the Price List. "),$this->url); //printf (_("You can purchase credit with a Credit Card or Bitcoin. "),$this->url, $this->url); //print "

"; //printf (_("You can purchase credit using Bitcoin. "), $this->url); print "

"; print "

"; if ($account->login_type!='subscriber') { print "

"; printf ("%s",$this->fraud_reason); } else { print _("Page Not Available"); $log=sprintf("CC transaction is not allowed from %s for %s (%s)",$_SERVER['REMOTE_ADDR'],$account->account,$this->fraud_reason); syslog(LOG_NOTICE, $log); } print "

"; if (!in_array("payments",$this->groups)) { print "

"; print _("Credit Card payments will be activated after your identity is verified. "); } printf( "

", _("Name"), _("Document"), _("Type"), _("Size"), _("Date"), _("Last digits"), _("Mobile Number") ); if ($this->login_type != 'subscriber') { print ""; } printf (""); $this->db->next_record(); $download_url=$this->url.'&action=export_identity_proof'; printf( "", $this->db->f('name'), $download_url, $this->db->f('file_name'), $this->db->f('file_type'), number_format($this->db->f('file_size')/1024,2), $this->db->f('file_date'), $this->db->f('last_digits'), $this->db->f('mobile_number') ); if ($this->login_type != 'subscriber') { if ($_REQUEST['task'] == 'delete_identity_proof' && !$_REQUEST['confirm']){ $delete_url=$this->url.'&tab=payments&task=delete_identity_proof&confirm=1'; printf("", $delete_url, _("Confirm")); } else { $delete_url=$this->url.'&tab=payments&task=delete_identity_proof'; printf("", $delete_url, $this->delete_img); } } printf(""); print "
%s%s%s%s%s%s%s"; print _("Actions"); print "
%s%s %s %s KB %s%s%s%s%s
"; } else { print "
"; print "

"; print _("Credit Card payments are available only to verified customers. "); print "

"; printf (_("To become verified, upload a copy of your passport or driving license that matches the Credit Card owner. "),$this->billing_email, $this->account, $this->billing_email); print "

"; printf (_("This copy will be kept on your profile until the credit card transaction has been approved. ")); print " "; print "

url method='post' enctype='multipart/form-data'> "; print " "; print " "; print " "; if (in_array("free-pstn",$this->groups)) { print " "; } print " "; print "
"; print _("Name printed on the Credit Card"); print " "; printf ("",$_REQUEST['name']); print "
"; print _("Scanned copy of your Passport or Driver License"); print " "; printf (""); print "
"; print _("Mobile Number"); print " "; printf(" %s",$_REQUEST['mobile_number'],_("International format starting with +")); print "
"; print _("Last 4 digits on your Credit Card"); print " "; printf("",$_REQUEST['last_digits']); print "
"; print "
"; } } function exportIdentityProof() { $this->db = new DB_CDRTool(); $query = sprintf("select * from subscriber_docs where username = '%s' and domain = '%s' and document = 'identity'", addslashes($this->username), addslashes($this->domain) ); if (!$this->db->query($query)) { print ""; printf ("Error for database query: %s (%s)", $this->db->Error,$this->db->Errno); print ""; } if ($this->db->num_rows()) { $this->db->next_record(); $h=sprintf("Content-type: %s",$this->db->f('file_type')); Header($h); $h=sprintf("Content-Disposition: attachment; filename=%s",$this->db->f('file_name')); Header($h); $h=sprintf("Content-Length: %s",$this->db->f('file_size')); Header($h); $this->db->p('file_content'); } } function showIdentityTab() { $this->getEnumMappings(); $this->getAliases(); $chapter=sprintf(_("SIP Account")); $this->showChapter($chapter); print "
"; /* print " "; */ print " "; print " "; print " "; if ($this->xcap_root && !in_array("trunking", $this->groups)) { print " "; } print "
"; print _("SIP Address"); print " sip:$this->account
"; print _("Full Name"); print " $this->fullName
"; print _("Username"); print " $this->username
"; print _("Domain/Realm"); print " $this->domain
"; print _("Outbound Proxy"); print " $this->sip_outbound_proxy
"; print _("XCAP Root"); print " $this->xcap_root
"; if ($this->pstn_access && $this->rpid) { $chapter=sprintf(_("PSTN")); $this->showChapter($chapter); print "
"; $t=0; foreach($this->enums as $e) { $t++; $rr=floor($t/2); $mod=$t-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print " "; } print "
"; print _("Caller-ID"); print " $this->rpid
"; print _("Phone Number"); print " $e
"; } if (!in_array("trunking",$this->groups)) { $chapter=sprintf(_("Aliases")); $this->showChapter($chapter); print "
"; printf (_("You may create new aliases for incoming calls")); printf ("
"); $t=0; print "
"; foreach($this->aliases as $a) { $t++; $rr=floor($t/2); $mod=$t-$rr*2; if ($mod ==0) { $_class='even'; } else { $_class='odd'; } print "
"; } print "
"; print "
"; print '
'; print $this->hiddenElements; print "
"; } if (!$this->isEmbedded() && $this->show_tls_section) { if ($this->enrollment_url) { include($this->enrollment_configuration); if (is_array($enrollment)) { $chapter=sprintf(_("TLS Certificate")); $this->showChapter($chapter); print " "; print _("X.509 Format"); printf (" Certificate ",$this->url); /* print " "; print _("PKCS#12 store format"); printf (" Certificate ",$this->url); */ } } } print "
"; print "
"; if ($this->email) { printf (_("Email SIP Account information to %s"),$this->email); print " "; } if ($this->sip_settings_page && $this->login_type != 'subscriber') { print "

"; printf (_("Login using SIP credentials at %s"),$this->sip_settings_page,$this->sip_settings_page); print "

"; } print $this->hiddenElements; print "
"; if($this->sip_settings_page) { $this->getbalancehistory(); if (count($this->balance_history) == "0" || $this->login_type != 'subscriber') { print "

"; print ""; $date1= new datetime($this->Preferences['account_delete_request']); $today= new datetime('now'); if ($this->Preferences['account_delete_request'] && $this->login_type != 'subscriber' ) { print "

User made a deletion request on: "; print $this->Preferences['account_delete_request']; print "

"; } if ($date1->diff($today)->d >= '2' || $this->Preferences['account_delete_request'] == '' || $this->login_type != 'subscriber' ) { print '

"; } print $this->hiddenElements; print "
"; } } function showDownloadTab() { if (in_array("trunking",$this->groups)) { return false; } $chapter=sprintf(_("SIP Client download")); $this->showChapter($chapter); print " "; $this->render_download_applet(); print " "; } function showDIDTab() { if (class_exists($this->did_processor_class)) { $did_processor = new $this->did_processor_class(); } if (!$_REQUEST['ddi_action']) { $chapter=sprintf(_("Registered Numbers")); $this->showChapter($chapter); print " "; $numbers=$did_processor->getOrders($this->account); if (count($numbers)) { print ""; printf (""); foreach (array_keys($numbers) as $_number) { $t++; $rr=floor($t/2); $mod=$t-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } $form=sprintf(" "; $form.=$this->hiddenElements; $form.=sprintf ("",$_number); $form.=sprintf (""); $form.=sprintf (""); printf ("",$_number,$numbers[$_number]['country_name'],$numbers[$_number]['did_expire_date_gmt'],$numbers[$_number]['order_id'],$form); } print "
NumberCountryExpire DateOrderAction
+%s%s%s%s
%s
"; } print " "; } if ($prefixes = $did_processor->getPrefixes()) { if ($_REQUEST['ddi_action'] == 'register' && $_REQUEST['prefix'] && $_REQUEST['period']) { $chapter=sprintf(_("Register New Number")); $this->showChapter($chapter); print " "; $total=$prefixes[$_REQUEST['prefix']]['setup']+$prefixes[$_REQUEST['prefix']]['monthly']* $_REQUEST['period']; $basket = array('ddi_number' => array('price' => sprintf("%.2f",$total), 'description' => sprintf(_('Telephone Number (+%s %s) for %d months'),$_REQUEST['prefix'],$prefixes[$_REQUEST['prefix']]['country_name'],$_REQUEST['period']), 'unit' => 'number', 'duration' => 'N/A', 'qty' => 1 ) ); $this->hiddenElements=sprintf(" ", $_REQUEST['prefix'], $_REQUEST['period'] ); $data=array('customer_id' => $this->owner, 'country_iso' => $prefixes[$_REQUEST['prefix']]['country_iso'], 'city_prefix' => $prefixes[$_REQUEST['prefix']]['city_prefix'], 'period' => $_REQUEST['period'], 'map_data' => array( 'map_type' => 'URI', 'map_proto' => 'SIP', 'map_detail' => $this->account, 'map_pref_server' => 1 ), 'prepaid_funds' => "0", 'uniq_hash' => md5(mt_rand()) ); $did_processor->createOrder($data); /* if (class_exists($this->payment_processor_class)) { $payment_processor = new $this->payment_processor_class($this,$basket); } if ($payment_processor->transaction_results['success']) { if ($did_processor->createOrder($data)) { // add ENUM entry } else { // notify admin about payment without service fullfilment } } */ print " "; } else if ($_REQUEST['ddi_action'] == 'Renew' && $_REQUEST['number'] && $_REQUEST['period']) { $chapter=sprintf(_("Renew Number")); $this->showChapter($chapter); print " "; $data=array('customer_id' => $this->owner, 'did_number' => $_REQUEST['number'], 'period' => $_REQUEST['period'], 'uniq_hash' => md5(mt_rand()) ); print "Renewing number...."; $did_processor->renewOrder($data); print " "; } else if ($_REQUEST['ddi_action'] == 'Drop' && $_REQUEST['number']) { $chapter = sprintf(_("Cancel Number")); $this->showChapter($chapter); print " "; $data=array('customer_id' => $this->owner, 'did_number' => $_REQUEST['number'] ); $did_processor->cancelOrder($data); print " "; } else { $chapter = sprintf(_("Register New Number")); $this->showChapter($chapter); print " "; print "
"; print _("Select a region where you want to have a telephone number: "); print "

"; print ""; print "

"; print _("Select the duration for which you want to use the telephone number: "); print "

"; print ""; print $this->hiddenElements; print "

"; print ""; print ""; print "

"; } print " "; } else { print "

Error fetching DDI prefixes"; } print " "; } function showSupportTab() { $chapter=sprintf(_("Support")); $this->showChapter($chapter); print " "; print "

"; printf (_("To request support you may send an e-mail to %s"),$this->support_email); if ($this->support_web) { print "

"; printf (_("For more information visit %s"),$this->support_web); } print " "; } function render_download_applet() { $this->valid_os=array('nt','mac'); require("browser.php"); $os=browser_detection('os'); if ($this->create_certificate) { if ($_passport = $this->generateCertificate()) { $_account['passport'] = $_passport; } } $_account['sip_address'] = $this->account; $_account['display_name'] = sprintf("%s %s",$this->firstName,$this->lastName); $_account['password'] = $this->password; $_account['web_password'] = $this->Preferences['web_password']; $_account['email'] = $this->email; $_account['settings_url'] = $this->digest_settings_page; $_account['xcap_root'] = $this->xcap_root; $_account['outbound_proxy'] = $this->sip_proxy; if ($this->enrollment_url) { include($this->enrollment_configuration); if (is_array($enrollment)) { $_account['msrp_relay'] = $enrollment['msrp_relay']; $_account['conference_server'] = $enrollment['conference_server']; $_account['settings_url'] = $enrollment['settings_url']; if ($enrollment['ldap_hostname']) { $_account['ldap_hostname'] = $enrollment['ldap_hostname']; } if ($enrollment['ldap_dn']) { $_account['ldap_dn'] = $enrollment['ldap_dn']; } } } if ($this->store_clear_text_passwords=='false') { $match_password=false; if ($_REQUEST['password']) { $str=$this->result->id->username.":".$this->result->id->domain.":".$_REQUEST['password']; if (md5($str) == $this->result->ha1) { $_account['password']=$_REQUEST['password']; $match_password=true; } } if (!$match_password){ print "

"; print _("Please enter your SIP account password: "); if ($_REQUEST['password'] || $_REQUEST['continue']) { print "

"; } else { print "

"; } print ""; print "
"; print ""; if ($_REQUEST['password'] || $_REQUEST['continue']) { print "Entered password does not match your account"; } print "
"; print ""; print "
"; print ""; print ""; print "
"; $class='hide'; } } print "
"; if (in_array($os,$this->valid_os)) { print ""; print ""; } else { print ""; } print ""; print ""; print "
"; printf(_("Download and install %s preconfigured with your SIP account:"), $this->blink_download_url, $this->show_download_tab); print "
"; printf( " ", rand(), $this->blink_download_url, rawurlencode(json_encode($_account)) ); print "
"; print "

"; printf( _("To download %s visit %s"), $this->show_download_tab, $this->blink_download_url, $this->blink_download_url ); print "

"; printf( _("If you have already installed %s, you can configure it to use your SIP account:"), $this->show_download_tab ); print "
"; printf( " ", rand(), $this->show_download_tab, urlencode(json_encode($_account)) ); print "
"; print "

"; printf ("Notes. "); print _("Java Runtime Environment (JRE) must be activated in the web browser. "); print "

"; } function showFooter() { print "
"; if ($this->footerFile) { include ("$this->footerFile"); } else { print ""; } print "
"; } function showSettingsTab() { $use_yubikey=0; /* if (stream_resolve_include_path('Auth/Yubico.php')) { require_once 'Auth/Yubico.php'; $use_yubikey=1; } */ $this->getVoicemail(); print "
"; $chapter=sprintf(_("SIP Account")); $this->showChapter($chapter); if ($this->login_type != "subscriber" ) { print "
"; print "
firstName\">"; print "
"; print "
"; print "lastName\">"; print "
"; } print "
"; if ($this->login_type == 'subscriber' && in_array("deny-password-change",$this->groups)) { print _("Password can be changed only by the operator"); } else { print '"; printf ("\n\n\n\n",$this->password); } print "
"; print "
"; print '"; // print ''; print ' '; //print _("Enter text to change the password to access this web page"); print "
"; if ($use_yubikey == 1 && !$this->isEmbedded()) { print "
"; print "Yubikey id to allow SIP Account + Yubikey login to access this webpage.

The Yubikey id is the first 12 digits of the string generated by the key.

It can be set by clicking in this text field and pressing your Yubikey."); printf ("\"name=yubikey value=\"%s\">",$this->Preferences['yubikey']) ; print _("Enter Yubikey id"); print "
"; //print '
';
             //print($this->Preferences['yubikey']);
             //print_r($this);
             //print '
'; } print "
"; print "
"; print "
"; $this->showTimezones('timezone',$this->timezone); print " "; $timestamp=time(); $LocalTime=getLocalTime($this->timezone,$timestamp); print ""; print _("Local Time"); print ": $LocalTime"; //dprint_r($this->availableGroups); print "
"; if (count($this->emergency_regions) > 0) { print "
"; print ""; print "
"; } if ($this->pstn_access) { if (in_array("free-pstn",$this->groups)) { if (in_array("quota",$this->groups)) { $_class="alert alert-error"; } else { $_class=""; } if ($this->pstn_changes_allowed) { print "
"; printf ("%s
",$this->currency,$this->quota); //print "
"; if ($this->quota || in_array("quota",$this->groups)) { $this->getCallStatistics(); if ($this->thisMonth['price']) { printf (_("This month usage: %.2f %s"),$this->thisMonth['price'], $this->currency); printf (" / %d ",$this->thisMonth['calls']); print _("Calls "); } } print " "; if ($this->pstn_changes_allowed) { print ""; } print "
"; } else if ($this->quota) { print "
"; printf ("%s %s ",$this->quota,$this->currency); $this->getCallStatistics(); if ($this->thisMonth['price']) { printf (_("This month usage: %.2f %s"),$this->thisMonth['price'], $this->currency); printf (" / %d ",$this->thisMonth['calls']); print _("Calls"); } print "
"; } } if ($this->prepaid) $checked_box_prepaid="checked"; if (!$this->prepaid_changes_allowed) $disabled_box_prepaid = "disabled=true"; print "
"; } foreach (array_keys($this->availableGroups) as $key) { unset($disabled_box); if ($this->login_type == 'subscriber' && !$this->availableGroups[$key]['SubscriberMaySeeIt']) { continue; } if ($this->login_type == 'reseller' && !$this->availableGroups[$key]['ResellerMaySeeIt']) { continue; } if (in_array($key,$this->groups)) { $checked_box[$key]="checked"; } $elementName = $this->availableGroups[$key]["WEBName"]; $elementComment = $this->availableGroups[$key]["WEBComment"]; if ($this->login_type == 'subscriber') { if ($this->availableGroups[$key]['SubscriberMayEditIt']) { $disabled_box = ""; } else { $disabled_box = "disabled=true"; } } elseif ($this->login_type == 'reseller') { if ($this->availableGroups[$key]['ResellerMayEditIt']) { $disabled_box = ""; } else { $disabled_box = "disabled=true"; } } if ($key=="free-pstn" && !$this->pstn_changes_allowed) { $disabled_box = "disabled=true"; } if ($key=="blocked" && $checked_box[$key]) { $_class="alert alert-error"; $_class1="error"; } else { $_class=""; $_class1=''; } print "
"; if ($key=="blocked") { if ($this->Preferences['blocked_by']) { $selected_blocked_by[$this->Preferences['blocked_by']]='selected'; } else if ($checked_box[$key]) { $selected_blocked_by['reseller']='selected'; } if ($this->login_type == 'admin' || $this->login_type == 'reseller') { if ($this->customer != $this->reseller || $selected_blocked_by['customer']) { printf (" ", $key, $selected_blocked_by['customer'], _("Blocked by Customer"), $this->customer, $selected_blocked_by['reseller'], _("Blocked by Reseller"), $this->reseller ); } else if ($this->reseller) { printf (" ", $key, _("Active"), $selected_blocked_by['reseller'], _("Blocked by Reseller"), $this->reseller ); } else { printf (" ", $key, _("Active"), $selected_blocked_by['reseller'], _("Blocked") ); } } else if ($this->login_type == 'customer' ) { if (in_array($key,$this->groups)) { if ($this->Preferences['blocked_by'] != 'reseller') { printf (" ", $key, _("Active"), $selected_blocked_by['customer'], _("Blocked") ); } else { print _("Blocked by Reseller"); } } else { printf (" ", $key, _("Active"), $selected_blocked_by['customer'], _("Blocked") ); } } else { if (in_array($key,$this->groups)) { print _("Blocked"); } else { print _("Active"); } } } else if ($key=="free-pstn") { if ($this->pstn_changes_allowed) { print " rpid\">"; } else { print ""; } else { print "$elementComment"; } } } else { print " "; } print "
"; } $this->showExtraGroups(); $this->showOwner(); $this->showQuickDial(); $this->showMobileNumber(); $this->showIPAccessList(); $this->showCallLimit(); print "
"); print "s",$this->timeout); print "
"; if (in_array("free-pstn",$this->groups) && !$this->show_barring_tab) { print "
"; if ($this->Preferences['show_barring_tab']){ $check_show_barring_tab="checked"; } else { $check_show_barring_tab=""; } printf ("\n",$check_show_barring_tab,_("Barring")); print "
"; } $this->showVoicemail(); $this->showBillingProfiles(); $chapter=sprintf(_("Notifications Address")); $this->showChapter($chapter); print "
email\">
"; print " "; print "
"; print "
"; print $this->hiddenElements; print " "; } function showDiversionsTab () { if (in_array("trunking",$this->groups)) { return false; } $this->getVoicemail(); $this->getEnumMappings(); $this->getDivertTargets(); $this->getDiversions(); print "
"; $chapter=sprintf(_("Call Forwarding")); $this->showChapter($chapter); $this->showDiversions(); print "
"; print " "; print "
"; print $this->hiddenElements; print "
"; } function showVoicemail() { if ($this->voicemail['Account']) { $checked_voicemail="checked"; } $chapter=sprintf(_("Voice Mailbox")); $this->showChapter($chapter); print "
"; if ($this->voicemail['Account']) { print "
"; if ($this->voicemail['Options']->delete=="True") { $checked_delete_voicemail="checked"; $selected_store_voicemail['email'] ="selected"; $selected_store_voicemail['server'] =""; } else { $selected_store_voicemail['email'] =""; $selected_store_voicemail['server'] ="selected"; } if (!$this->voicemail['DisableOptions']) { print ""; } else { printf (_("Voice messages are sent by email to %s"),$this->email); } print "
"; if (!$this->voicemail['DisableOptions']) { print "
"; printf ("",$this->voicemail['Password']); print "
"; if ($this->voicemail_access_number) { print "
"; printf(_("Dial %s to listen to your messages or change preferences. "),$this->voicemail_access_number); print "
"; } } } } function showOwner() { if ($this->login_type == 'subscriber') { //print "owner\">"; return true; } print "
owner\">"; print "
"; } function showDevicesTab() { $this->getDeviceLocations(); if (count($this->locations)) { $chapter=sprintf(_("SIP Devices")); $this->showChapter($chapter); $j=0; print "
"; foreach (array_keys($this->locations) as $location) { $j++; $contact = $this->locations[$location]['contact']; $publicContact = $this->locations[$location]['publicContact']; $expires = normalizeTime($this->locations[$location]['expires']); $user_agent = $this->locations[$location]['user_agent']; $transport = $this->locations[$location]['transport']; $UAImage = $this->getImageForUserAgent($user_agent); $rr=floor($j/2); $mod=$j-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print ""; print ""; print ""; } print "
"; printf ("",$this->SipUAImagesPath,$UAImage); print ""; print "$user_agent"; if ($transport == 'tls') print " "; print "
"; print _("Location"); print ""; print " "; if (strlen($transport)) print "$transport:"; print "$contact "; if ($publicContact != $contact) { print " ($publicContact) "; } if ($publicContact) { $_els=explode(":",$publicContact); if ($_loc=geoip_record_by_name($_els[0])) { $this->geo_location=$_loc['country_name'].'/'.utf8_encode($_loc['city']); } else if ($_loc=geoip_country_name_by_name($_els[0])) { $this->geo_location=$_loc; } else { $this->geo_location=''; } printf ("%s",$this->geo_location); } print "
$expires
"; } } function getBarringPrefixes() { dprint("getBarringPrefixes()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getBarringPrefixes($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } $this->barring_prefixes=$result; return true; } function setBarringPrefixes() { dprint("setBarringPrefixes"); $prefixes=array(); $barring_prefixes=$_REQUEST['barring_prefixes']; foreach ($barring_prefixes as $_prefix) { if (preg_match("/^\+[1-9][0-9]*$/",$_prefix)) { $prefixes[]=$_prefix; } } dprint("setBarringPrefixes"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setBarringPrefixes($this->sipId,$prefixes); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } function showBarringTab() { $chapter=sprintf(_("Barred Destinations")); $this->showChapter($chapter); print "

"; print "
"; print _("You can deny outbound calls to unwanted PSTN prefixes. "); print "
"; print "
"; print "
"; print ""; print _("Example"); print ": +31900"; print "
"; if ($this->getBarringPrefixes()) { foreach ($this->barring_prefixes as $_prefix) { $found++; $rr=floor($found/2); $mod=$found-$rr*2; if ($mod == 0) { $_class='odd'; } else { $_class='even'; } print "
"; print ""; print "
"; print "
"; } } print " "; print "
"; print "
"; print $this->hiddenElements; print " "; } function saveSettings() { $this->getVoicemail(); /* $this->getEnumMappings(); $this->getDivertTargets(); $this->getDiversions(); */ $this->changedFields=array(); $this->sendCEmail=0; foreach ($this->form_elements as $el) { ${$el} = $_REQUEST[$el]; } $newACLarray = array(); $result = $this->result; if (!is_array($result->properties)) $result->properties=array(); if (!is_array($result->groups)) $result->groups=array(); if ($mailto && $this->email != $mailto) { $result->email=$mailto; $this->email=$mailto; $this->somethingChanged=1; $this->voicemailOptionsHaveChanged=1; $this->sendCEmail=1; array_push($this->changedFields,"Email Address"); } if ($this->login_type != "subscriber") { if ($first_name && $this->firstName != $first_name) { $result->firstName = $first_name; $this->firstName = $first_name; $this->somethingChanged=1; $this->voicemailOptionsHaveChanged=1; } if ($last_name && $this->lastName != $last_name) { $result->lastName = $last_name; $this->lastName = $last_name; $this->somethingChanged=1; } } $this->properties=$result->properties; $this->availableGroups['voicemail']=array("Group"=>"voicemail", "WEBName" =>sprintf (_("Voice Mailbox")), "SubscriberMayEditIt"=>"1", "SubscriberMaySeeIt"=>0 ); if (!$this->voicemail['Account'] && $voicemail) { if ($this->addVoicemail()) { $this->setVoicemailDiversions(); $this->createdVoicemailnow=1; } } else if ($this->voicemail['Account'] && !$voicemail) { if ($this->deleteVoicemail()) { $this->voicemail['Account']=""; $this->removeVoicemailDiversions(); } } if ($this->pstn_changes_allowed) { if (strcmp($quota,$this->quota) != 0) { if (!$quota) $quota=0; $result->quota=intval($quota); dprint ("change the quota"); $this->somethingChanged=1; } if ($quota_deblock) { $result->groups = array_unique(array_diff($this->groups,array('quota'))); $this->somethingChanged=1; $this->SipPort->addHeader($this->SoapAuth); $this->SipPort->removeFromGroup(array("username" => $this->username,"domain"=> $this->domain), "quota"); } $rpid=trim($rpid); if (strcmp($rpid,$this->rpid) != 0) { dprint ("change the rpid"); $result->rpid=$rpid; $this->somethingChanged=1; } if ($this->CallLimitChangePolicy()) { if ($this->soapEngines[$this->sip_engine]['call_limit']) { if (isset($callLimit) && $this->callLimit != $callLimit) { $result->callLimit=intval($callLimit); $this->somethingChanged=1; } } } } $owner=intval($owner); if ($owner != $this->owner && $this->login_type != 'subscriber') { dprint ("change the owner"); $result->owner=$owner; $this->somethingChanged=1; } else { $result->owner=$this->owner; } if ($this->prepaid_changes_allowed) { if(!$result->prepaid && $_REQUEST['prepaid']){ if ($result->quota) { $this->somethingChanged=1; } $this->somethingChanged=1; } else if ($result->prepaid && !$_REQUEST['prepaid']) { $this->somethingChanged=1; } $result->prepaid=intval($_REQUEST['prepaid']); } reset($this->availableGroups); foreach (array_keys($this->availableGroups) as $key) { // $val is set to 1 if web checkbox is ticked $val = $_REQUEST[$key]; if ($this->login_type != 'subscriber' || $this->availableGroups[$key]['SubscriberMayEditIt']) { if ($key == 'free-pstn') { if (in_array($key,$this->groups) && !$val) { if ($this->quota) { // we save quota for later use when pstn access is re-granted $this->somethingChanged=1; $this->setPreference('last_sip_quota',"$this->quota"); } $this->somethingChanged=1; } else if (!in_array($key,$this->groups) && $val) { if (!$this->prepaid_changes_allowed) { $this->somethingChanged=1; $result->prepaid=1; } } if (!in_array($key,$this->groups) && $val) { $this->setPreference('last_sip_quota',strval($this->quota)); $last_sip_quota=$this->Preferences['last_sip_quota']; if ($last_sip_quota) { $result->quota=intval($last_sip_quota); $this->somethingChanged=1; } } if ($this->pstn_changes_allowed) { if ($val) $newACLarray[]=trim($key); } else { if (in_array($key,$this->groups)) { $newACLarray[]=trim($key); } } } else if ($key == 'trunking') { if ($this->login_type == 'admin' || $this->login_type == 'reseller') { if (!$val && in_array($key,$this->groups)) { # TODO remove diversions } } if ($val) $newACLarray[]=trim($key); } else if ($key == 'blocked') { if ($this->login_type == 'admin' || $this->login_type == 'reseller') { if ($val && $val != $this->Preferences['blocked_by']) { $this->setPreference('blocked_by',$val); $this->somethingChanged=1; } else if (!$val && in_array($key,$this->groups)) { $this->somethingChanged=1; $this->setPreference('blocked_by',''); } if ($val) $newACLarray[]=trim($key); } else if ($this->login_type == 'customer' ) { if ($this->Preferences['blocked_by'] != 'reseller') { if ($val && ($val != $this->Preferences['blocked_by'] || !in_array($key,$this->groups) )) { $this->setPreference('blocked_by',$val); $this->somethingChanged=1; $newACLarray[]=trim($key); } else if (!$val && in_array($key,$this->groups)) { $this->somethingChanged=1; $this->setPreference('blocked_by',''); } if ($val) $newACLarray[]=trim($key); } else { // copy old setting if exists if (in_array($key,$this->groups)) { $newACLarray[]=trim($key); } } } } else if ($key == 'sms') { if ($this->sms_changes_allowed) { if (!$val && in_array($key,$this->groups)) { $this->somethingChanged=1; } else if ($val && !in_array($key,$this->groups)) { $this->somethingChanged=1; } if ($val) $newACLarray[]=trim($key); } else { // copy old setting if exists if (in_array($key,$this->groups)) { $newACLarray[]=trim($key); } } } else { if ($val) $newACLarray[]=trim($key); } } else { // copy old setting if exists if (in_array($key,$this->groups)) { $newACLarray[]=trim($key); } } } $foundGroupInAvailableGroups=array(); $extra_groups=explode(' ',$_REQUEST['extra_groups']); foreach ($extra_groups as $_grp) { if (!in_array($_grp,array_keys($this->availableGroups))) { $newACLarray[]=$_grp; } } $grantACLarray = array_unique(array_diff($newACLarray,$this->groups)); $revokeACLarray = array_unique(array_diff($this->groups,$newACLarray)); /* dprint_r($this->groups); dprint_r($newACLarray); dprint_r($grantACLarray); dprint_r($revokeACLarray); */ if (count($revokeACLarray) || count($grantACLarray)) { $result->groups=$newACLarray; $this->somethingChanged=1; } if ($language && $language != $this->Preferences['language'] ) { if ($this->login_type == 'subscriber') {; //print("Set lang $language"); $this->changeLanguage($language); } $this->setPreference("language",$language); $this->somethingChanged=1; } if ($show_barring_tab != $this->Preferences['show_barring_tab'] ) { $this->setPreference("show_barring_tab",$show_barring_tab); $this->somethingChanged=1; } if ($this->Preferences['account_delete_request'] ) { $this->setPreference("account_delete_request",date('m/d/Y h:i:s a', time())); $this->somethingChanged=1; } if ($this->login_type == 'subscriber' && in_array("deny-password-change",$this->groups)) { } else if ($sip_password) { if ($this->store_clear_text_passwords) { $result->password=$sip_password; } else { $md1=strtolower($this->username).':'.strtolower($this->domain).':'.$sip_password; $md2=strtolower($this->username).'@'.strtolower($this->domain).':'.strtolower($this->domain).':'.$sip_password; $result->password=md5($md1).':'.md5($md2); } $this->sendCEmail=1; array_push($this->changedFields,"Password"); $this->somethingChanged=1; } if ($web_password) { if ($this->store_clear_text_passwords) { $web_password_new=$web_password; } else { $md1=strtolower($this->username).':'.strtolower($this->domain).':'.$web_password; $md2=strtolower($this->username).'@'.strtolower($this->domain).':'.strtolower($this->domain).':'.$web_password; $web_password_new=md5($md1).':'.md5($md2); } $this->setPreference('web_password',$web_password_new); $this->sendCEmail=1; array_push($this->changedFields,"Web password"); $this->somethingChanged=1; } if ($web_password_reset) { $this->setPreference('web_password','remove'); $this->somethingChanged=1; } if ($this->Preferences['yubikey'] != $yubikey && !$this->isEmbedded()) { $this->setPreference('yubikey',$yubikey); $this->somethingChanged=1; } if (is_array($result->acl) and count($result->acl)) { foreach (array_keys($result->acl) as $key) { if (isset($result->acl[$key]->tag) && $result->acl[$key]->tag == '') { unset($result->acl[$key]->tag); } } } if ($this->IPAccessListChangePolicy()) { if (isset($ip_access_list) and $this->ip_access_list != $ip_access_list) { $ip_access_list=preg_replace("/\s+/","\n", trim($ip_access_list)); $list=explode("\n", trim($ip_access_list)); $ip_access_list=array(); foreach ($list as $el) { list($ip,$mask) = explode("/",$el); if ($mask <0 or $mask > 32) { continue; } if (!preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/",$ip)) { continue; } $ip_access_list[]=array('ip'=>$ip, 'mask'=>intval($mask)); } $result->acl=$ip_access_list; $this->somethingChanged=1; } } if (!$result->password) unset($result->password); if ($timezone && $timezone != $this->timezone) { $result->timezone=$timezone; $this->somethingChanged=1; } if ($region != $this->region) { $result->region=$region; $this->somethingChanged=1; } if (strcmp($quickdial,$this->quickdial) != 0) { $result->quickdialPrefix=$quickdial; $this->somethingChanged=1; } $mobile_number = preg_replace("/[^\+0-9]/","",$mobile_number); if ($mobile_number && !preg_match("/^\+/",$mobile_number)) { $mobile_number='+'.$mobile_number; } if ($this->Preferences['mobile_number'] != $mobile_number) { $this->setPreference('mobile_number',$mobile_number); $this->somethingChanged=1; } if (!$this->createdVoicemailnow) { // moved to its own tab //$this->setDiversions(); } if ($this->timeoutWasNotSet || $timeout != $this->timeout) { $this->somethingChanged=1; $result->timeout=intval($timeout); } if ($result->owner == '') { $this->somethingChanged=1; $result->owner=0; } if ($result->callLimit == '') { $this->somethingChanged=1; $result->callLimit=0; } if ($result->quota == '') { $this->somethingChanged=1; $result->quota=0; } if ($result->timeout == '') { $this->somethingChanged=1; $result->timeout=35; } if ($result->timeout > 900) { $this->somethingChanged=1; $result->timeout=900; } if ($this->somethingChanged) { $result->properties=$this->properties; if (!$result->quota) $result->quota=0; //dprint_r($result); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->updateAccount($result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { dprint("Call updateAccount"); if ($this->sendCEmail && $this->notify_on_sip_account_changes) { $this->sendChangedEmail(False,$this->changedFields); } } } if ($this->voicemail['Account'] && !$this->createdVoicemailnow) { $delete_voicemail = $_REQUEST['delete_voicemail']; //$log=sprintf("delete_voicemail_orig=%s",$this->voicemail['Options']->delete); //dprint($log); if (($delete_voicemail && !$this->voicemail['Options']->delete) || (!$delete_voicemail && $this->voicemail['Options']->delete)) { $this->voicemail['Options']=array("delete"=>intval($delete_voicemail)); $this->voicemailOptionsHaveChanged=1; } $voicemail_password=preg_replace("/[^0-9]/","",$voicemail_password); if ($this->voicemail['Password'] != $voicemail_password) { $this->voicemailOptionsHaveChanged=1; $this->voicemail['Password']=$voicemail_password; } if ($this->voicemailOptionsHaveChanged) { $this->updateVoicemail(); } } $this->updateBillingProfiles(); } function setDiversions() { dprint ("setDiversions()"); $this->getVoicemail(); $this->getEnumMappings(); $this->getDivertTargets(); $this->getDiversions(); foreach (array_keys($this->diversionType) as $condition) { $select_name = $condition."_select"; $selectedIdx = $_REQUEST[$select_name]; $textboxURI = $_REQUEST[$condition]; if ($textboxURI && $textboxURI != "" && !preg_match("/@/",$textboxURI)) { $textboxURI=$textboxURI."@".$this->domain; } if (preg_match("/^([\+|0].*)@/",$textboxURI,$m)) { $textboxURI=$m[1]."@".$this->domain; } $uri_description = $this->divertTargets[$selectedIdx]['description']; if ($uri_description == 'Other' || $textboxURI == "") { $selectedURI = $textboxURI; } else { $selectedURI = $this->divertTargets[$selectedIdx]['value']; } $uri = $selectedURI; if (!$this->voicemail['Account'] && $uri_description == 'Voicemail') { dprint("No voicemail account found"); $uri_description='Disabled'; } if ($this->diversions[$condition]) { if ($uri_description=='Disabled' && $this->CallPrefUriType[$condition]!='Disabled') { $diversions[$condition]=""; } else if ($uri_description != 'Disabled' && $selectedURI) { if (checkURI($selectedURI)) { if ($this->CallPrefUriType[$condition]=='Disabled') { $diversions[$condition]=""; } else { if ($this->diversions[$condition] != $uri) { $diversions[$condition]=$uri; } else { $diversions[$condition]=$this->diversions[$condition]; } } } else { $diversions[$condition]=$this->diversions[$condition]; dprint("Failed to check address $selectedURI"); } } } else if ($uri_description!='Disabled' && $selectedURI) { if (checkURI($selectedURI)) { $diversions[$condition]=$uri; } else { dprint("Failed to check address $condition=\"$selectedURI\""); $diversions[$condition]=$this->diversions[$condition]; } } if (!$uri_description) $uri_description="Other"; if ($uri_description == 'Other') { $last_other=$uri; } else { $last_other = $this->CallPrefLastOther[$condition]; } $_prefLast = $condition."_lastOther"; if ($uri_description=='Other' && $this->Preferences[$_prefLast] != $last_other ) { $this->setPreference($_prefLast,$last_other); } } foreach(array_keys($this->diversions) as $key) { if ($this->diversions[$key] != $diversions[$key]) { //$log=sprintf("Diversion %s changed from %s to %s",$key,htmlentities($this->diversions[$key]),htmlentities($diversions[$key])); dprint($log); $divert_changed=1; } if ($diversions[$key]) { if ($diversions[$key] == "") { if ($this->absolute_voicemail_uri) { $diversionsSOAP[$key] = 'sip:'.$this->voicemail['Account']; } else { $diversionsSOAP[$key] = $diversions[$key]; } } else { $diversionsSOAP[$key]='sip:'.$diversions[$key]; } } else { if ($diversions[$key]) $diversionsSOAP[$key]=$diversions[$key]; } } if (!is_array($diversionsSOAP) || count($diversionsSOAP) == 0) { $diversionsSOAP=array("nocondition"=>"empty"); } if ($divert_changed) { $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setCallDiversions($this->sipId,$diversionsSOAP); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error2 (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { $this->diversions=$diversions; } } } function setDiversion($condition,$uri) { dprint ("setDiversion($condition,$uri)"); $condition=trim($condition); $uri=trim($uri); $this->getVoicemail(); $this->getDivertTargets(); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCallDiversions($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } $_uri_saved=$uri; if ($_uri_saved == "voicemail") { $uri=""; foreach ($this->divertTargets as $target) { if ($target['description'] == 'Voicemail') { $uri=$target['value']; break; } } } if ($_uri_saved == "mobile") { $uri=""; foreach ($this->divertTargets as $target) { dprint_r($target); if ($target['description'] == 'Mobile') { $uri=$target['value']; break; } } } if ($_uri_saved == "other" && $this->CallPrefLastOther[$condition]) { $uri=$this->CallPrefLastOther[$condition]; } if (strlen($uri)) { if ($uri != "") { if (!preg_match("/^(sip:|sips:)/",$uri)) $uri="sip:".$uri; } } else { $uri=NULL; } reset($this->diversionType); foreach(array_keys($this->diversionType) as $_condition) { $uri=$result->$_condition; if ($this->absolute_voicemail_uri && $uri == "") { $uri = $this->voicemail['Account']; } if (preg_match("/^(sip:|sips:)(.*)$/i",$uri,$m)) { $uri=$m[2]; } //if (!$uri) $uri=NULL; $this->diversions[$condition]=$uri; } dprint_r($this->diversions); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setCallDiversions($this->sipId,$result); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } function setVoicemailDiversions() { dprint ("setVoicemailDiversions()"); if ($this->getVoicemail()) { if (!$this->absolute_voicemail_uri) { $diversions['FBUS']=""; $diversions['FNOA']=""; $diversions['FNOL']=""; } else { $diversions['FBUS']="sip:".$this->voicemail['Account']; $diversions['FNOA']="sip:".$this->voicemail['Account']; $diversions['FNOL']="sip:".$this->voicemail['Account']; } $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setCallDiversions($this->sipId,$diversions); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } } function removeVoicemailDiversions() { dprint ("removeVoicemailDiversions()"); $this->getDiversions(); $diversions=array(); foreach (array_keys($this->diversionType) as $key) { if ($this->diversions[$key]=="" || preg_match("/voicemail_server/",$this->diversions[$key])) { $diversions_have_changed=true; } else { if ($this->diversions[$key]) { $diversions[$key]=$this->diversions[$key]; } } } if (!count($diversions)) { $diversions['nocondition']='empty'; } if ($diversions_have_changed) { $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setCallDiversions($this->sipId,$diversions); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } } else { return true; } } function updateVoicemail() { dprint("updateVoicemail()"); $account=array("sipId" => $this->sipId, "email" => $this->email, "name" => $this->firstName.' '.$this->lastName, "password" => $this->voicemail['Password'], "options" => $this->voicemail['Options'] ); dprint_r($account); $this->VoicemailPort->addHeader($this->SoapAuthVoicemail); $result = $this->VoicemailPort->updateAccount($account); if ((new PEAR)->isError($result)) { $error_msg=$result->getMessage(); $error_fault=$result->getFault(); $error_code=$result->getCode(); print "$error_msg\n"; printf ("

Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } return true; } function addVoicemail() { dprint("addVoicemail()"); $password = $this->RandomPassword(); $_account = array( "sipId" => $this->sipId, "name" => $this->fullName, "password" => $password, "email" => $this->email, "options" => array("delete" => 1) ); $this->VoicemailPort->addHeader($this->SoapAuthVoicemail); $result = $this->VoicemailPort->addAccount($_account); if ((new PEAR)->isError($result)) { $error_msg=$result->getMessage(); $error_fault=$result->getFault(); $error_code=$result->getCode(); print "$error_msg\n"; printf ("

Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } return true; } function deleteVoicemail() { dprint("deleteVoicemail()"); $this->VoicemailPort->addHeader($this->SoapAuthVoicemail); $result = $this->VoicemailPort->deleteAccount($this->sipId); if ((new PEAR)->isError($result)) { $error_msg=$result->getMessage(); $error_fault=$result->getFault(); $error_code=$result->getCode(); print "$error_msg\n"; printf ("

Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } return true; } function setPreference($name,$value) { dprint("setPreference($name,$value)"); if (!$name) return; if (!is_array($this->properties)) { $this->properties=array(); } foreach (array_keys($this->properties) as $_key) { $_prop=$this->properties[$_key]; if ($_prop->name == $name) { if (strlen($value)) { if ($value != 'remove') { $newProperties[]=array('name'=> $name, 'value' => $value); } } $found=1; } else { $newProperties[]=$_prop; } } if (!$found) { $newProperties[]=array('name' => $name, 'value' => $value); } if ($this->properties!=$newProperties) $this->somethingChanged=1; if (!$newProperties) $newProperties = array(); $this->properties=$newProperties; //dprint_r($this->properties); } function showCreditTab() { if ($this->login_type == 'subscriber' && in_array("blocked",$this->groups)) { return false; } $task = $_REQUEST['task']; $issuer = $_REQUEST['issuer']; $prepaidCard = $_REQUEST['prepaidCard']; $prepaidId = $_REQUEST['prepaidId']; $_done = false; if ($issuer) { print " "; if ($issuer=='subscriber'){ if ($prepaidCard && $prepaidId) { if ($result = $this->addBalanceSubscriber($prepaidCard,$prepaidId)) { print "

"; printf (_("Old balance was %s, new balance is %s. "),$result->old_balance, $result->new_balance); print ""; $_done=true; } } } else if ($issuer=='reseller' || $issuer=='admin') { if ($_REQUEST['task'] == 'change_balance') { $description = $_REQUEST['description']; $value = $_REQUEST['value']; if (strlen($value) && $result = $this->addBalanceReseller($value,$description)) { print "

"; printf (_("Old balance was %s, new balance is %s. "),$result->old_balance, $result->new_balance); print ""; $_done=true; } } else if ($_REQUEST['task'] == 'refund') { $transaction = json_decode(base64_decode($_REQUEST['transaction'])); printf ("Refunding transaction id %s in value of %s", $transaction->id, $transaction->value); require('cc_processor.php'); $ccp = new CreditCardProcessor(); $refund_results = $ccp->refundPayment($transaction->id); if(count($refund_results['error']) > 0 ){ printf ("

Error %d: %s (%s)",$refund_results['error']['error_code'], $refund_results['error']['desc'], $refund_results['error']['short_message']); } else { printf ("

Transaction %s refunded with %s: %s",$transaction->id, $refund_results['success']['desc']->RefundTransactionID,$refund_results['success']['desc']->GrossRefundAmount->_value); $description=sprintf("Refund %s with %s",$transaction->id, $refund_results['success']['desc']->RefundTransactionID); if ($result = $this->addBalanceReseller(-$transaction->value,$description)) { print "

"; printf (_("Old balance was %s, new balance is %s. "),$result->old_balance, $result->new_balance); print ""; $_done=true; } } } } if ($_done && $_REQUEST['notify']) { $subject=sprintf ("SIP Account %s balance update",$this->account); $body="Your SIP Account balance has been updated. ". "For more details go to $this->sip_settings_page?tab=credit"; if (mail($this->email, $subject, $body, "From: $this->support_email")) { printf (_("Subscriber has been notified at %s."), $this->email); } } print " "; } $this->getPrepaidStatus(); if ($this->prepaidAccount) { $chapter=sprintf(_("Current Balance")); $this->showChapter($chapter); print "

"; print _("Your current balance is"); print ": "; printf ("%.2f %s ",$this->prepaidAccount->balance,$this->currency); print "
"; $this->showChangeBalanceReseller(); $this->showChangeBalanceSubscriber(); $this->showBalanceHistory(); } } function showChangeBalanceReseller () { if (!$this->prepaid_changes_allowed) return false; $chapter=sprintf(_("Add Balance")); $this->showChapter($chapter); print "
url method=post>
"; print " "; print ""; print " "; print "
"; $transactions = $this->getPaymentIds(); if (count($transactions)) { $chapter=sprintf(_("Refund Transaction")); $this->showChapter($chapter); print "
url method=post> "; print _("Transaction Id"); print " "; print " Notify
"; } } function showChangeBalanceSubscriber () { $this->showPrepaidVoucherForm(); } function showPrepaidVoucherForm () { if ($this->isEmbedded()) return true; $chapter=sprintf(_("Prepaid Card")); $this->showChapter($chapter); print "
"; printf (_("To add Credit to your account using a Prepaid Card enter it below. ")); print "
"; print "
url method=post>
"; print " "; print ""; if ($this->login_type != 'subscriber') { print " "; } print "
"; } function getPrepaidStatus() { dprint("getPrepaidStatus()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getPrepaidStatus(array($this->sipId)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); unset($this->prepaidAccount); return false; } else { $this->prepaidAccount=$result[0]; return true; } } function addBalanceSubscriber($prepaidCard,$prepaidId) { dprint("addBalanceSubscriberLocal($prepaidCard,$prepaidId)"); $card = array('id' => intval($prepaidId), 'number' => $prepaidCard ); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->addBalanceFromVoucher($this->sipId,$card); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { return $result; } } function addBalanceReseller($value=0,$description='') { $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->addBalance($this->sipId,floatval($value),$description); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { return $result; } } function getBalanceHistory() { dprint("getBalanceHistory()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCreditHistory($this->sipId,200); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "2000") { printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); } } $this->balance_history=$result->entries; } function getPaymentIds() { $transactions = array(); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCreditHistory($this->sipId,200); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "2000") { printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); } } $refunded_transactions=array(); $credit_transactions=array(); foreach ($result->entries as $entry) { if (preg_match("/^CC transaction (.*)$/",$entry->description,$m)) { $credit_transactions[$m[1]]=$entry->value; } if (preg_match("/^Refund (.*) with (.*)$/",$entry->description,$m)) { $refunded_transactions[]=$m[1]; } } foreach (array_keys($credit_transactions) as $tran) { if (!in_array($tran, $refunded_transactions)) { $transactions[$tran] = $credit_transactions[$tran]; } } return $transactions; } function getTodayBalanceSummary() { $total_debit = 0; $total_credit = 0; foreach ($this->balance_history as $_line) { $value=$_line->value; if (substr($_line->date,0,10) != date("Y-m-d")) { break; } if ($value <0) { $total_debit+=$value; } if ($value >0) { $total_credit+=$value; } } $total = array('debit' => $total_debit, 'credit' => $total_credit ); return $total; } function showBalanceHistory() { $this->getBalanceHistory(); if (!count($this->balance_history)) { return; } $chapter=sprintf(_("Balance History")); $this->showChapter($chapter); print "

"; $today_summary = $this->getTodayBalanceSummary(); if ($today_summary['credit'] >= $max_credit_per_day) { print "

"; printf (_("Today's transactions: %.2f credit, %.2f debit"), $today_summary['credit'],$today_summary['debit']); } print "

"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; foreach ($this->balance_history as $_line) { if (strstr($_line->description,'Session')) { if (!$_line->value) continue; $value=$_line->value; if ($this->cdrtool_address && !$this->isEmbedded()) { $description=sprintf("$_line->description",$this->cdrtool_address,urlencode($_line->session)); } else { $description=$_line->description; } } else { $description=$_line->description; $value=$_line->value; } if ($value <0) { $total_debit+=$value; } if ($value >0) { $total_credit+=$value; } $found++; $rr=floor($found/2); $mod=$found-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print " "; printf (" ",$found, $_line->date, $_line->action, $description, number_format($value,4), number_format($_line->balance,4) ); } print " "; if (strlen($total_credit)) { printf (" ", _("Total Credit"), number_format($total_credit,4) ); } if (strlen($total_debit)) { printf (" ", _("Total Debit"), number_format($total_debit,4) ); } print "
"; print ""; print _("Date and Time"); print ""; print _("Action"); print ""; print _("Description"); print ""; print _("Value"); print ""; print _("Balance"); print "
%d %s %s %s %s %s
%s %s
%s %s
"; if ($found) { if (!$this->isEmbedded()) { print "

url&tab=credit&action=get_balance_history&csv=1 target=_new data-original-title='"; print _("Export"); print "' data-content='"; print _("Export balance history in CSV format"); print "' rel='popover' onclick=\"window.open('$this->url&tab=credit&action=get_balance_history&csv=1]')\">"; print _("Export"); print "

"; } else { print "

url&tab=credit&action=get_balance_history&csv=1 data-original-title='"; print _("Export"); print "' data-content='"; print _("Export balance history in CSV format"); print "' onclick=\"location.href='$this->url&tab=credit&action=get_balance_history&csv=1';\">"; print _("Export"); print "

"; } } print ""; } function exportBalanceHistory() { Header("Content-type: text/csv"); $h=sprintf("Content-Disposition: inline; filename=%s-prepaid-history.csv",$this->account); Header($h); print _("Id"); print ","; print _("Account"); print ","; print _("Date"); print ","; print _("Action"); print ","; print _("Description"); print ","; print _("Value"); print ","; print _("Final Balance"); print ("\n"); foreach ($this->balance_history as $_line) { if (strstr($_line->description,'Session') && !$_line->value) continue; $found++; printf ("%s,%s,%s,%s,%s,%s,%s\n", $found, $this->account, $_line->date, $_line->action, $_line->description, $_line->value, $_line->balance); } } function showDiversions($conditions=array()) { // for busy not online or unconditional foreach (array_keys($this->diversionType) as $condition) { $_prefName = $condition."_lastOther"; $this->CallPrefLastOther[$condition]= $this->Preferences[$_prefName]; } if (!count($conditions)) { $conditions=$this->diversionType; } foreach (array_keys($conditions) as $condition) { $found++; $rr=floor($found/2); $mod=$found-$rr*2; $pref_name = $conditions[$condition]; $pref_value = $this->diversions[$condition]; $select_name=$condition."_select"; $set_uri_java="set_uri_" . $condition; $update_text_java="update_text_" . $condition; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print "
"; $phoneValues = array(); foreach ($this->divertTargets as $phones) { $phoneValues[] = $phones['value']; } $lastOther = $this->CallPrefLastOther[$condition]; $otherIdx = count($this->divertTargets) - 1; $phoneValues[$otherIdx] = $lastOther; $targets = sprintf("'%s'", join("', '", $phoneValues)); print " "; print ""; if ($this->CallPrefUriType[$condition]=='Other') $style = "visible"; else $style = "hidden"; $pref_value=$this->diversions[$condition]; print " "; if ($condition=="FUNV" && $this->FUNC_access_number) { print "
"; printf (_("Dial %s2*X where X = Number of Minutes, 0 to Reset"), $this->access_numbers['FUNC']); print "
"; } print "
"; } } function showHeader() { /*print "
";*/ print "
"; if ($this->logoFile) { print "logoFile border=0>"; } print "
"; /* print "
"; */ } function chapterTableStart() { } function chapterTableStop() { } function getEnumMappings () { dprint("getEnumMappings()"); $this->enums=array(); $filter=array( 'type' => 'sip', 'mapto' => $this->account, 'owner' => intval($this->owner) ); // Range $range=array('start' => 0, 'count' => 10 ); // Order $orderBy = array('attribute' => 'changeDate', 'direction' => 'ASC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->EnumPort->addHeader($this->SoapAuthEnum); $result = $this->EnumPort->getNumbers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (EnumPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } foreach($result->numbers as $_number) { $enum='+'.$_number->id->number; $this->voicemailUsernameOptions[]=$enum; if (!in_array($enum,$this->enums)) $this->enums[]=$enum; } } function enum2tel($enum_text) { // transform enum style domain name in forward telephone number $enum_text=trim($enum_text); if (preg_match("/^\+\d+$/",$enum_text)) { return $enum_text; } $z=0; $tel_text=""; while ($z < strlen($enum_text)) { $char = substr($enum_text,$z,1); if (preg_match("/[a-zA-Z]/",$char)) { break; } else if (preg_match("/[0-9]/",$char)) { $tel_text=$char.$tel_text; $z++; } else { $z++; } } if ($tel_text) { $tel_text="+".$tel_text; return ($tel_text); } else { return $enum_text; } } function showTimezones($name,$value) { if (!$fp = fopen("timezones", "r")) { print _("Failed to open timezone file."); return false; } printf (""; } function showQuickDial() { if (!preg_match("/^\d+$/",$this->username)) return 1; print "

quickdial\">"; if ($this->quickdial && preg_match("/^$this->quickdial/",$this->username)) { $dial_suffix=strlen($this->username) - strlen($this->quickdial); } printf (_("Prefix to auto-complete short numbers"),$dial_suffix); print "
"; } function showMobileNumber() { if (in_array("free-pstn",$this->groups)) { print "
%s
",$this->Preferences['mobile_number'],_("International format starting with +")); } } function CallLimitChangePolicy() { if ($this->login_type == 'subscriber' and $this->call_limit_may_by_changed_by == 'reseller') { return false; } if ($this->login_type == 'subscriber' and $this->call_limit_may_by_changed_by == 'customer') { return false; } if ($this->login_type == 'subscriber' and $this->call_limit_may_by_changed_by == 'admin') { return false; } if ($this->login_type == 'customer' and $this->call_limit_may_by_changed_by == 'reseller') { return false; } if ($this->login_type == 'customer' and $this->call_limit_may_by_changed_by == 'admin') { return false; } if ($this->login_type == 'reseller' and $this->call_limit_may_by_changed_by == 'admin') { return false; } return true; } function IPAccessListChangePolicy() { if ($this->login_type == 'subscriber' and $this->ip_access_list_may_by_changed_by == 'reseller') { return false; } if ($this->login_type == 'subscriber' and $this->ip_access_list_may_by_changed_by == 'customer') { return false; } if ($this->login_type == 'subscriber' and $this->ip_access_list_may_by_changed_by == 'admin') { return false; } if ($this->login_type == 'customer' and $this->ip_access_list_may_by_changed_by == 'reseller') { return false; } if ($this->login_type == 'customer' and $this->ip_access_list_may_by_changed_by == 'admin') { return false; } if ($this->login_type == 'reseller' and $this->ip_access_list_may_by_changed_by == 'admin') { return false; } return true; } function showIPAccessList() { if (!$this->soapEngines[$this->sip_engine]['ip_access_list']) { return; } if (!$this->IPAccessListChangePolicy()) { print "
%s
",$this->ip_access_list); } else { print "
",$this->ip_access_list); } } function showCallLimit() { if (!$this->pstn_access) { return; } if (!in_array("free-pstn",$this->groups)) { return; } if (!$this->soapEngines[$this->sip_engine]['call_limit']) { return; } $limit_text = sprintf(_("Default is %s"), $this->platform_call_limit); if (strlen($this->callLimit)) { $limit_text_ro=$this->callLimit; } else { $limit_text_ro=$this->platform_call_limit; } if (!$this->CallLimitChangePolicy()) { print "
%s
",$limit_text_ro); } else { print "
%s
",$this->callLimit, $limit_text); } } function showCallsTab() { $this->getHistory(); if ($this->calls) { $chapter=sprintf(_("Call Statistics")); $this->showChapter($chapter); $calltime=normalizeTime($this->duration); print " "; if ($this->cdrtool_address) { print "cdrtool_address target=cdrtool>"; print _("Summary"); print ""; } else { print _("Usage Data"); } print " "; printf (_("%s calls / %s / %s / %.2f %s"), $this->calls, $calltime,$this->trafficPrint,$this->price,$this->currency); print " "; print " "; print _("First / Last Call"); print " $this->firstCall / $this->lastCall "; } if ($this->enable_thor) { $cdr_source = 'sipthor'; } else { $cdr_source = 'sip_trace'; } if (count($this->calls_received)) { $chapter=sprintf(_("Incoming")); $this->showChapter($chapter); $j=0; print ""; foreach (array_keys($this->calls_received) as $call) { $j++; $uri = $this->calls_received[$call]['remoteParty']; $media=""; foreach ($this->calls_received[$call]['media'] as $m) { $media.="$m,"; } $media=quoted_printable_decode($media); $media=rtrim($media,","); $duration = normalizeTime($this->calls_received[$call]['duration']); $dialURI = $this->PhoneDialURL($uri) ; $htmlDate = $this->colorizeDate($this->calls_received[$call]['startTime']); $htmlURI = $this->htmlURI($uri); $urlURI = urlencode($this->normalizeURI($uri)); $sessionId = urlencode($this->calls_received[$call]['sessionId']); $fromTag = urlencode($this->calls_received[$call]['fromTag']); $toTag = urlencode($this->calls_received[$call]['toTag']); $proxyIP = urlencode($this->calls_received[$call]['proxyIP']); $trace_link = "Server Logs"; if (!$this->calls_received[$call]['duration']) { $htmlURI = "$htmlURI"; } $rr=floor($j/2); $mod=$j-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print " "; print ""; print ""; print " "; } print "
$htmlDate $dialURI $duration $htmlURI ($media)$trace_linkurl&tab=contacts&task=add&uri=$urlURI&search_text=$urlURI>$this->phonebook_img
"; } if (count($this->calls_placed)) { $chapter=sprintf(_("Outgoing")); $this->showChapter($chapter); $j=0; print ""; foreach (array_keys($this->calls_placed) as $call) { $j++; if ($this->calls_placed[$call]['to'] == "sip:".$this->voicemail['Account'] ) { continue; } $uri = $this->calls_placed[$call]['remoteParty']; $media = ""; foreach ($this->calls_placed[$call]['media'] as $m) { $media.="$m,"; } $media=rtrim($media,","); $price = $this->calls_placed[$call]['price']; $status = $this->calls_placed[$call]['status']; $rateinfo = $this->calls_placed[$call]['rateInfo']; $duration = normalizeTime($this->calls_placed[$call]['duration']); $dialURI = $this->PhoneDialURL($uri) ; $htmlDate = $this->colorizeDate($this->calls_placed[$call]['startTime']); $stopTime = $this->calls_placed[$call]['stopTime']; $htmlURI = $this->htmlURI($uri); $urlURI = urlencode($this->normalizeURI($uri)); $sessionId = urlencode($this->calls_placed[$call]['sessionId']); $fromTag = urlencode($this->calls_placed[$call]['fromTag']); $toTag = urlencode($this->calls_placed[$call]['toTag']); $proxyIP = urlencode($this->calls_placed[$call]['proxyIP']); $trace_link = "Server Logs"; if ($price) { $price_print =sprintf(" (%s %s)",$price,$this->currency); } else { $price_print = ''; } $rr=floor($j/2); $mod=$j-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } if (!$stopTime) { $duration = _('In progress'); } print " "; print ""; print ""; print " "; } print "
$htmlDate $dialURI $duration $htmlURI ($media) $price_print$trace_linkurl&tab=contacts&task=add&uri=$urlURI&search_text=$urlURI>$this->phonebook_img
"; } } function getHistory($status = 'all') { dprint("getHistory()"); $fromDate = time() - 3600 * 24 * 14; // last two weeks $toDate = time(); $CallQuery = array( "fromDate" => $fromDate, "toDate" => $toDate, "limit" => 50 ); $CallsQuery = array( "placed" => $CallQuery, "received" => $CallQuery ); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCalls($this->sipId, $CallsQuery); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } // received calls foreach ($result->received as $callStructure) { $media = array(); $apps = explode(",", quoted_printable_decode($callStructure->applicationTypes[0])); foreach ($apps as $app) { $media[] = trim($app); } if (!$callStructure->stopTime && $status == 'completed') { continue; } $fromHeader = quoted_printable_decode($callStructure->fromHeader); $this->calls_received[] = array( "remoteParty" => quoted_printable_decode($callStructure->fromURI), "displayName" => getDisplayNameFromFromHeader($fromHeader), "startTime" => getLocalTime($this->timezone, $callStructure->startTime), "stopTime" => getLocalTime($this->timezone, $callStructure->stopTime), "timezone" => $this->timezone, "duration" => $callStructure->duration, "status" => $callStructure->status, "sessionId" => quoted_printable_decode($callStructure->sessionId), "fromTag" => quoted_printable_decode($callStructure->fromTag), "toTag" => quoted_printable_decode($callStructure->toTag), "proxyIP" => $callStructure->proxyIP, "media" => $media ); } // placed calls foreach ($result->placed as $callStructure) { if ($callStructure->status == 435) continue; $media = array(); $apps = explode(",", quoted_printable_decode($callStructure->applicationTypes[0])); foreach ($apps as $app) { $media[] = trim($app); } if (!$callStructure->stopTime && $status == 'completed') { continue; } $fromHeader = quoted_printable_decode($callStructure->fromHeader); $this->calls_placed[] = array( "remoteParty" => quoted_printable_decode($callStructure->toURI), "displayName" => "", "startTime" => getLocalTime($this->timezone, $callStructure->startTime), "stopTime" => getLocalTime($this->timezone, $callStructure->stopTime), "timezone" => $this->timezone, "duration" => $callStructure->duration, "status" => $callStructure->status, "price" => $callStructure->price, "sessionId" => quoted_printable_decode($callStructure->sessionId), "fromTag" => quoted_printable_decode($callStructure->fromTag), "toTag" => quoted_printable_decode($callStructure->toTag), "proxyIP" => $callStructure->proxyIP, "media" => $media ); } $this->call_history = array( 'placed' => $this->calls_placed, 'received' => $this->calls_received ); } function getCallStatistics() { dprint("getCallStatistics()"); $fromDate = mktime(0, 0, 0, date("m"), "01", date("Y")); $toDate = time(); $CallQuery = array( "fromDate" => $fromDate, "toDate" => $toDate ); $CallQuery = array( "limit" => 1 ); $CallsQuery = array( "placed" => $CallQuery ); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getCallStatistics($this->sipId, $CallsQuery); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } //dprint_r($result); $this->thisMonth['calls'] = $result->placed->calls; $this->thisMonth['price'] = $result->placed->price; } function addPhonebookEntry() { dprint("addPhonebookEntry()"); $uri = strtolower(trim($_REQUEST['uri'])); $name = trim($_REQUEST['name']); $group = trim($_REQUEST['group']); if (!strlen($uri)) return false; $phonebookEntry = array( 'uri' => $uri, 'name' => $name, 'group' => $group ); dprint("addPhonebookEntry"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->addPhoneBookEntry($this->sipId, $phonebookEntry); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s
", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } return true; } function updatePhonebookEntry() { dprint("updatePhonebookEntry()"); $uri = strtolower(trim($_REQUEST['uri'])); $group = trim($_REQUEST['group']); $name = trim($_REQUEST['name']); $phonebookEntry = array( 'name' => $name, 'uri' => $uri, 'group' => $group ); //dprint_r($phonebookEntry); dprint("updatePhonebookEntry"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->updatePhoneBookEntry($this->sipId, $phonebookEntry); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } return true; } function deletePhonebookEntry() { dprint("deletePhonebookEntry()"); $uri = strtolower($_REQUEST['uri']); dprint("deletePhonebookEntry"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->deletePhoneBookEntry($this->sipId, $uri); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } return true; } function getPhoneBookEntries() { dprint("getPhoneBookEntries()"); if ($_REQUEST['task'] == 'search') { $search_text = trim($_REQUEST['uri']); } $group = trim($_REQUEST['group']); if (!strlen($search_text)) $search_text="%" ; $match = array( 'uri' => '%'.$search_text.'%', 'name' => '%'.$search_text.'%' ); if (strlen($group)) { if ($group == "empty") { $match['group'] = ''; } else { $match['group'] = $group; } } $range = array( 'start' => 0, 'count' => 100 ); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getPhoneBookEntries($this->sipId, $match, $range); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } $this->PhonebookEntries=$result->entries; //dprint_r($this->PhonebookEntries); } function showContactsTab() { dprint("showContactsTab()"); if ($this->show_directory) { $chapter = sprintf(_("Directory")); $this->showChapter($chapter); print "

"; print _("To find other SIP Addresses fill in the First Name or the Last Name and click the Search button. "); print "
"; $this->showSearchDirectory(); print "
"; } if ($this->rows || $_REQUEST['task'] == 'directory') { // hide local contacts if we found a global contact return true; } $chapter = sprintf(_("Don't Disturb")).' '.sprintf(_("Groups")); $this->showChapter($chapter); print "
"; print _("You can organize contacts into groups that can be used to accept incoming calls in Don't Disturb section. "); print "
"; $adminonly = $_REQUEST['adminonly']; $accept = $_REQUEST['accept']; // selected search group; $task = $_REQUEST['task']; //if ($task == "search" ){ $search_text = $_REQUEST['uri']; // } $confirm = $_REQUEST['confirm']; $group = $_REQUEST['group']; $uri = $_REQUEST['uri']; $name = $_REQUEST['name']; if ($task == "deleteContact" && $confirm) { $this->deletePhonebookEntry(); unset($task); unset($confirm); } elseif ($task == "update") { $this->updatePhonebookEntry(); unset($task); } elseif ($task == "add") { $this->addPhonebookEntry(); unset($task); } $this->getPhoneBookEntries(); $maxrowsperpage = 250; $url_string = $this->url."&tab=contacts"; printf( "
", $this->url, $this->url, $this->url, _("Add sip address or search for contacts") ); if (count($this->PhonebookEntries) || $task == "search"){ $selected[$group] = "selected"; printf( " ", $selected['empty'], _("No group"), _("Search") ); } printf( "
%s
", _("Add"), _("(wildcard %)") ); if (count($this->PhonebookEntries)){ print "

"; print ""; print ""; print ""; print ""; foreach (array_keys($this->PhonebookEntries) as $_entry) { $found = $i + 1; $rr = floor($found / 2); $mod = $found - $rr * 2; if ($mod == 0) { $_class = 'odd'; } else { $_class = 'even'; } printf( " %s ", $_class, $found, $this->url, $this->tab, $this->hiddenElements, $this->tab, $this->PhonebookEntries[$_entry]->uri, $found, $this->PhonebookEntries[$_entry]->uri ); if (preg_match("/\%/", $this->PhonebookEntries[$_entry]->uri)) { print ""; if ($task == "deleteContact" && $uri == $this->PhonebookEntries[$_entry]->uri) { print ""; $i++; } print "
"; print ""; print _("SIP Address"); print ""; print ""; print ""; print _("Display Name"); print ""; print _("Group"); print ""; print _("Action"); print "
%s%s"; } else { printf( " %s ", $this->PhoneDialURL($this->PhonebookEntries[$_entry]->uri) ); } printf("
", $this->PhonebookEntries[$_entry]->name); printf("%s
", _("Update")); print "
"; printf( ""; print ""; printf( "", $url_string, urlencode($this->PhonebookEntries[$_entry]->uri), urlencode($search_text) ); print _("Confirm"); } else { print ""; printf( "", $url_string, urlencode($this->PhonebookEntries[$_entry]->uri), urlencode($search_text) ); if ($this->delete_img) { //print $this->delete_img; print ""; } else { print _("Delete"); } } print ""; print "
"; print ""; } } function exportPhonebook($userAgent) { dprint("exportPhonebook()"); $this->getPhonebookEntries(); $this->contentType = "Content-type: text/csv"; if (!is_array($this->PhonebookEntries) || !count($this->PhonebookEntries)) return true; if (!$userAgent) $userAgent = 'snom'; if ($userAgent == 'snom') { $this->export_filename = "tbook.csv"; $phonebook .= sprintf("Name,Address,Group\n"); } elseif ($userAgent == 'eyebeam') { $phonebook .= sprintf("Name,Group Name,SIP URL,Proxy ID\n"); } elseif ($userAgent == 'csco') { $this->contentType = "Content-type: text/xml"; $this->export_filename = "directory.xml"; $phonebook .= sprintf( "\n\t%s\n\tDirectory\n", $this->account ); } elseif ($userAgent == 'unidata') { $this->export_filename = "phonebook.csv"; $phonebook .= sprintf("Index,Name,,,,\n"); $phonebook .= sprintf("0,Undefined,,,,\n"); $z = 1; foreach ($this->PhonebookGroups as $_group) { $this->groupIndex[$_group] = $z; $phonebook .= sprintf("%s,%s,,,,\n", $z, $_group); $z++; } $phonebook .= sprintf("\nIndex,Name,RdNm,Tel,Group\n"); } $found = 0; foreach (array_keys($this->PhonebookEntries) as $_entry) { $fname = $this->PhonebookEntries[$_entry]->firstName; $lname = $this->PhonebookEntries[$_entry]->lastName; $uri = $this->PhonebookEntries[$_entry]->uri; $group = $this->PhonebookEntries[$_entry]->group; if (!preg_match("/[_%]/", $uri)) { $uri = substr($uri, 4); $els = explode("@", $uri); if ($els[1] == $this->domain) $uri=$els[0]; if ($userAgent == 'snom') { $phonebook .= sprintf( "%s %s,%s,%s\n", $fname, $lname, $uri, $this->PhonebookGroups[$group] ); } elseif ($userAgent == 'unidata' && $fname && $lname) { $phonebook .= sprintf( "%s,%s,%s %s,%s,%s\n", $found, $fname, $fname, $lname, $uri, $this->PhonebookGroups[$group] ); } elseif ($userAgent == 'eyebeam') { $phonebook .= sprintf( "%s %s,%s,1\n", $fname, $lname, $this->PhonebookEntries[$_entry]->uri, $this->PhonebookGroups[$group] ); } elseif ($userAgent == 'csco') { $phonebook .= sprintf( "\n\t\n\t%s %s\n\t%s\n\t\n", $fname, $lname, $uri ); } $found++ ; } } if ($userAgent == 'csco') { $phonebook .= sprintf("\n\n"); } Header($this->contentType); $_header = sprintf("Content-Disposition: inline; filename=%s", $this->export_filename); Header($_header); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header("Pragma: no-cache"); print $phonebook; } function getRejectMembers() { dprint("getRejectMembers()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getRejectMembers($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } $this->rejectMembers = $result; //dprint_r($this->rejectMembers); return true; } function setRejectMembers() { $members = array(); $rejectMembers = $_REQUEST['rejectMembers']; foreach ($rejectMembers as $_member) { if (strlen($_member) && !preg_match("/^sip:/", $_member)) { $_member = 'sip:'.$_member; } if (strlen($_member)) $members[] = $_member; } dprint("setRejectMembers"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setRejectMembers($this->sipId, $members); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf( "

Error (SipPort): %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } } function getJournalEntries() { $this->journalEntries['success'] = false; $this->journalEntries['error_message'] = NULL; $this->journalEntries['results'] = array(); $return_summary = $_REQUEST['summary']; if ($this->chat_replication_backend == 'mysql') { $this->db = new DB_CDRTool(); $where=""; if ($_REQUEST['except_uuid']) { $where.= sprintf(" and uuid <> '%s'", addslashes($_REQUEST['except_uuid'])); } if ($_REQUEST['after_id']) { $after_id = intval($_REQUEST['after_id']); } else { $after_id = 0; } $where.= sprintf(" and id > %d", addslashes($after_id)); if ($_REQUEST['after_timestamp']) { $where.= sprintf(" and timestamp > '%s'", addslashes($_REQUEST['after_timestamp'])); } if ($_REQUEST['limit'] and intval($_REQUEST['limit']) < 5000) { $limit = intval($limit); } else { $limit = 5000; } $query=sprintf("select * from client_journal where account = '%s' %s order by timestamp ASC limit %d", addslashes($this->account), $where, $limit); if (!$this->db->query($query)) { $this->journalEntries['error_message'] = 'Database Failure'; $this->journalEntries['rows'] = 0; return false; } else { $this->journalEntries['success'] = true; $this->journalEntries['rows'] = $this->db->num_rows(); } if ($this->db->num_rows()) { while ($this->db->next_record()) { $entry = array( 'id' => $this->db->f('id'), 'source' => 'default', 'timestamp' => $this->db->f('timestamp'), 'account' => $this->db->f('account'), 'uuid' => $this->db->f('uuid'), 'ip_address' => $this->db->f('ip_address'), 'data' => $this->db->f('data') ); $this->journalEntries['results'][]=$entry; } } } return True; } function putJournalEntries() { $result['results'] = array(); if (strlen($_REQUEST['uuid'])) { $uuid = $_REQUEST['uuid']; } else { $result['success'] = false; $result['error_message'] = 'Missing uuid'; return $result; } if (strlen($_REQUEST['data'])) { $data = $_REQUEST['data']; } else { $result['success'] = false; $result['error_message'] = 'Missing data'; return $result; } if ($this->chat_replication_backend == 'mysql') { $this->db = new DB_CDRTool(); } if ($rows=json_decode($data)) { foreach ($rows as $row) { if (!property_exists($row, 'data')) { continue; } $entry = $row->data; if (property_exists($row, 'action')) { $action = $row->action; } else { $action = 'add'; } if ($this->chat_replication_backend == 'mysql') { $query=sprintf("insert into client_journal (timestamp, account, uuid, data, ip_address) values (NOW(),'%s', '%s', '%s', '%s')", addslashes($this->account), addslashes($uuid), addslashes($entry), addslashes($_SERVER['REMOTE_ADDR'])); if (!$this->db->query($query)) { $result['results'][]=array('id' => $row->id, 'journal_id' => NULL, 'source' => 'default' ); } else { $query="select LAST_INSERT_ID() as id"; $this->db->query($query); $this->db->next_record(); $id = $this->db->f('id'); $result['results'][]=array('id' => $row->id, 'journal_id' => $id, 'source' => 'default' ); } } } $result['success'] = true; } else { $result['success'] = false; $result['error_message'] = 'Json decode error'; } return $result; } function deleteJournalEntries() { if (strlen($_REQUEST['data'])) { $data = $_REQUEST['data']; $entries = json_decode($data); } else { if (strlen($_REQUEST['journal_id'])) { $entries=array($_REQUEST['journal_id']); } else { $result['success'] = false; $result['error_message'] = 'Missing data'; return $result; } } if ($this->chat_replication_backend == 'mysql') { $this->db = new DB_CDRTool(); } if ($entries) { if ($this->chat_replication_backend == 'mysql') { $journal_id_sql=""; foreach ($entries as $entry) { $journal_id_sql.=sprintf("'%s',",$entry); } $journal_id_sql = rtrim($journal_id_sql,","); $query=sprintf("delete from client_journal where account in '%s' and journal_id in (%s)", addslashes($this->account), addslashes($journal_id_sql)); if (!$this->db->query($query)) { $result['error_message'] = 'database error'; } else { $result['success'] = true; } } } else { $result['success'] = false; $result['error_message'] = 'No journal entries provided'; } return $result; } function getAcceptRules() { dprint("getAcceptRules()"); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->getAcceptRules($this->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } foreach(array_keys($result->rules->persistent) as $_rule) { $_key=$result->rules->persistent[$_rule]->days; $this->acceptRules['persistent'][$_key]=array('start' =>$result->rules->persistent[$_rule]->start, 'stop' =>$result->rules->persistent[$_rule]->stop, 'groups'=>$result->rules->persistent[$_rule]->groups); } $this->acceptRules['temporary']=array('groups' => $result->rules->temporary->groups, 'duration'=> $result->rules->temporary->duration ); $this->acceptRules['groups'] = $result->nonEmptyGroups; //dprint_r($this->acceptRules); return true; } function setAcceptRules() { dprint("setAcceptRules()"); $persistentAcceptArray=array(); $temporaryAcceptArray=array(); foreach (array_keys($this->acceptDailyProfiles) as $profile) { unset($groups); $radio_persistentVarName='radio_persistent_'.$profile; $radio_persistent=$_REQUEST[$radio_persistentVarName]; if ($radio_persistent=="0") { $groups[]='everybody'; } else if ($radio_persistent=="1") { $groups[]='nobody'; } else if ($radio_persistent=="2") { $groupsVarName='groups_'.$profile; $groups=$_REQUEST[$groupsVarName]; } $startVarName='start_'.$profile; $start=$_REQUEST[$startVarName]; $stopVarName='stop_'.$profile; $stop=$_REQUEST[$stopVarName]; if (!preg_match("/^[0-2][0-9]:[0-5][0-9]$/",$start) || !preg_match("/^[0-2][0-9]:[0-5][0-9]$/",$stop) || ($start=="00:00" && $stop=="00:00") || !$start || !$stop || ($radio_persistent=="2" && (!is_array($groups) || !count($groups) )) ) { continue; } $persistentAcceptArray[]=array('start' => $start, 'stop' => $stop, 'groups' => $groups, 'days' => intval($profile) ); } // temporary $radio_temporary=$_REQUEST['radio_temporary']; unset($groups_temporary); if ($radio_temporary=="0") { $groups_temporary[]='everybody'; } else if ($radio_temporary=="1") { $groups_temporary[]='nobody'; } else if ($radio_temporary=="2") { $groups_temporary=$_REQUEST['groups_temporary']; } if (!is_array($groups_temporary)) $groups_temporary=array(); $duration=$_REQUEST['duration']; $temporaryAccept=array("groups" => $groups_temporary, "duration"=> intval($duration) ); // combine persistent and temporary $rules=array("persistent" =>$persistentAcceptArray, "temporary" =>$temporaryAccept); $this->SipPort->addHeader($this->SoapAuth); $result = $this->SipPort->setAcceptRules($this->sipId,$rules); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } return true; } function showAcceptTab() { if (in_array("trunking",$this->groups)) { return false; } $chapter=sprintf(_("Do Not Disturb")); $this->showChapter($chapter); $this->getAcceptRules(); $this->getVoicemail(); $this->getDivertTargets(); $this->getDiversions(); print "

"; print "

"; print _("You can reject calls depending on the time of day and Caller-ID. "); print _("You can create custom groups in the Contacts page like Family or Coworkers. "); print "

"; print _("Rejected calls are diverted based on the Unavailable condition in the Call Forwarding page. "); print "

"; print "

"; printf (_("Your current time is: %s"),$this->timezone); $timestamp=time(); $LocalTime=getLocalTime($this->timezone,$timestamp); print " $LocalTime"; print "

"; // $chapter=sprintf(_("Rules")); // $this->showChapter($chapter); /* print "
"; print _("This will override the permanent rules for the chosen duration. "); print "
"; */ if ($this->acceptRules['temporary']['duration']) { $class_e='error'; } else { $class_e=''; } // print "
// //"; // print ""; // print _("minute(s)"); // print ""; //print "
//
//"; $chapter=sprintf(_("Rules")); $this->showChapter($chapter); print "
"; print ""; print ""; print ""; $_name="radio_temporary"; $_checked_everybody=""; $_checked_nobody=""; $_checked_groups=""; if (is_array($this->acceptRules['temporary']['groups']) &&in_array("everybody",$this->acceptRules['temporary']['groups'])) { $_checked_everybody="checked"; } else if (is_array($this->acceptRules['temporary']['groups']) && in_array("nobody",$this->acceptRules['temporary']['groups'])) { $_checked_nobody="checked"; } else if (!in_array('everybody',$this->acceptRules['temporary']['groups']) && !in_array('nobody',$this->acceptRules['temporary']['groups']) && count($this->acceptRules['temporary']['groups'])) { $_checked_groups="checked"; } if ($_checked_nobody) { $class_nobody="checked_groups"; } else { $class_nobody="note"; } printf (" ",$_name,$_checked_everybody,_("Everybody")); printf ("",$_name,$_checked_nobody,_("Nobody")); $c=count($this->acceptRules['groups']); if ($_checked_groups) { $class_groups="checked_groups"; } else { $class_groups="note"; } print ""; print " "; foreach (array_keys($this->acceptDailyProfiles) as $profile) { if ($this->acceptRules['persistent'][$profile]['start'] || $this->acceptRules['persistent'][$profile]['stop']) { $class="checked_groups"; $class2="label label-info"; } else { $class="mhj"; $class2=''; } if ($profile==1) { print ""; } print " "; unset($selected_StartTime); $selected_StartTime[$this->acceptRules['persistent'][$profile]['start']]="selected"; printf ("",$_name,$_checked_everybody,_("Everybody")); printf ("",$_name,$_checked_nobody,_("Nobody")); $c=count($this->acceptRules['groups']); if ($_checked_groups) { $class_groups="checked_groups"; } else { $class_groups="note"; } print " "; } print "
"; print _("Temporary"); print "
"; print _("Duration"); print ""; if ($this->acceptRules['temporary']['duration']) { printf (' ',$this->acceptRules['temporary']['duration']); print " acceptRules['temporary']['duration']; print "\" disabled=true>"; print " acceptRules['temporary']['duration']; print "\"> "; } else { print " "; print _("Minute(s)"); print ""; } print " %s %s "; if (count($this->acceptRules['groups'])>2) { printf ("",$_name,$_checked_groups); $i=0; foreach(array_keys($this->acceptRules['groups']) as $_group) { $i++; if (preg_match("/(everybody|nobody)/",$this->acceptRules['groups'][$_group])) continue; if (in_array($this->acceptRules['groups'][$_group],$this->acceptRules['temporary']['groups'])) { $_checked="checked"; } else { $_checked=""; } $_name="groups_temporary[]"; printf (" %s\n", $_name, $this->acceptRules['groups'][$_group], $_checked, $this->PhonebookGroups[$this->acceptRules['groups'][$_group]] ); } } print "
"; print _("Permanent"); print "
"; print _("Days"); print " "; print _("Time Interval"); print " "; print _("Groups"); print "
"; printf ("%s",$this->acceptDailyProfiles[$profile]); print ""; unset($selected_StopTime); $selected_StopTime[$this->acceptRules['persistent'][$profile]['stop']]="selected"; printf (""; $_name="radio_persistent_".$profile; $_checked_everybody=""; $_checked_nobody=""; $_checked_groups=""; if (is_array($this->acceptRules['persistent'][$profile]['groups']) && in_array("everybody",$this->acceptRules['persistent'][$profile]['groups'])) { $_checked_everybody="checked"; } else if (is_array($this->acceptRules['persistent'][$profile]['groups']) && in_array("nobody",$this->acceptRules['persistent'][$profile]['groups'])) { $_checked_nobody="checked"; } else if (!in_array('everybody',$this->acceptRules['persistent'][$profile]['groups']) && !in_array('nobody',$this->acceptRules['persistent'][$profile]['groups']) && count($this->acceptRules['persistent'][$profile]['groups'])) { $_checked_groups="checked"; } else { $_checked_everybody="checked"; } if ($_checked_nobody) { $class_nobody="checked_groups"; } else { $class_nobody="note"; } printf (" %s %s"; if (count($this->acceptRules['groups'])>2) { printf ("",$_name,$_checked_groups); $i=0; foreach(array_keys($this->acceptRules['groups']) as $_group) { $i++; if (preg_match("/(everybody|nobody)/",$this->acceptRules['groups'][$_group])) continue; if (in_array($this->acceptRules['groups'][$_group],$this->acceptRules['persistent'][$profile]['groups'])) { $_checked="checked"; } else { $_checked=""; } $_name="groups_".$profile."[]"; printf (" %s ", $_name, $this->acceptRules['groups'][$_group], $profile, $_checked, $this->PhonebookGroups[$this->acceptRules['groups'][$_group]] ); } } print "
"; print "
"; print " "; print "
"; print $this->hiddenElements; print " "; $chapter=sprintf(_("Rejected Callers")); $this->showChapter($chapter); print "
"; print "
"; print _("Use %Number@% to match PSTN numbers and user@domain to match SIP Addresses"); print "
"; if ($this->getRejectMembers()) { foreach ($this->rejectMembers as $_member) { $j++; $rr=floor($j/2); $mod=$j-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } print "
"; print ""; print "
"; print "
"; } } print "
"; print ""; print "
"; print "
"; print "
"; print " "; print "
"; print " "; print $this->hiddenElements; print " "; } private function includeSmarty() { define("SMARTY_DIR", "/usr/share/php/smarty3/"); include_once(SMARTY_DIR . 'Smarty.class.php'); if (!class_exists(Smarty)) { define("SMARTY_DIR", "/usr/share/php/smarty/libs/"); include_once(SMARTY_DIR . 'Smarty.class.php'); } } function deleteAccount($skip_html=False) { dprint("SipSettings->deleteAccount($this->account, $this->email)"); $this->getBalanceHistory(); if (count($this->balance_history) != "0" && $this->login_type == 'subscriber') { return false; } if (!$this->email && !$skip_html) { print "

"; print _("Please fill in the e-mail address. "); print ""; return false; } $subject = sprintf("Removal of SIP account %s", $this->account); //$this->expire_date = new DateTime('now'); $this->expire_date = date("Y-m-d H:i:s", strtotime("+2 days")); $this->ip = $_SERVER['REMOTE_ADDR']; $tpl_html = $this->getEmailDeleteTemplateHTML($this->reseller, $this->Preferences['language']); //dprint("$tpl_html"); if (!$tpl_html && !$skip_html) { print "

"; print _("Error: no HTML email template found"); print ""; return false; } //print "$tpl_html"; $this->includeSmarty(); $smarty = new Smarty; $smarty->template_dir = '.'; //$smarty->use_sub_dirs = true; //$smarty->cache_dir = 'templates_c'; $smarty->assign('client', $this); //print"$this->sip_settings_page"; if ($tpl_html) { $bodyhtml = $smarty->fetch($tpl_html); } include_once 'Mail.php'; include_once 'Mail/mime.php' ; $hdrs = array( 'From' => $this->support_email, 'Subject' => $subject, // 'Cc' => $this->support_email ); //dprint("1"); $crlf = "\n"; $mime = new Mail_mime($crlf); if ($tpl_html) { $mime->setHTMLBody($bodyhtml); } $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); if ($mail->send($this->email, $hdrs, $body)) { if (!$skip_html) { $this->Preferences['account_delete_request'] = 1; $this->saveSettings(); $this->getAccount($this->account); print "

"; printf(_("Removal email has been sent to %s"), $this->email); } return 1; } } function sendEmail($skip_html=False) { dprint("SipSettings->sendEmail($this->email)"); $this->getVoicemail(); $this->getEnumMappings(); $this->getAliases(); $this->countAliases=count($this->aliases); if (!$this->email && !$skip_html) { print "

"; print _("Please fill in the e-mail address. "); print ""; return false; } $subject = sprintf("SIP Account settings %s", $this->account); //if ($_REQUEST['sip_filter'] == '1') { // $identifier = $this->RandomIdentifier(); //} $tpl = $this->getEmailTemplate($this->reseller, $this->Preferences['language']); if (!$tpl && !$skip_html) { print "

"; print _("Error: no email template found"); print ""; return false; } $tpl_html = $this->getEmailTemplateHTML($this->reseller, $this->Preferences['language']); //if (!$tpl_html && !$skip_html) { // print "

"; // print _("Error: no HTML email template found"); // print ""; //} if (!$this->store_clear_text_password) { $web_password = ''; } if (in_array("free-pstn", $this->groups)) $this->allowPSTN=1; // used by smarty $this->includeSmarty(); $smarty = new Smarty; $smarty->template_dir = '.'; //$smarty->use_sub_dirs = true; //$smarty->cache_dir = 'templates_c'; $smarty->assign('client', $this); $bodyt = $smarty->fetch($tpl); if ($tpl_html) { $bodyhtml = $smarty->fetch($tpl_html); } include_once 'Mail.php'; include_once 'Mail/mime.php' ; $hdrs = array( 'From' => $this->support_email, 'Subject' => $subject ); $crlf = "\n"; $mime = new Mail_mime($crlf); $mime->setTXTBody($bodyt); if ($tpl_html) { $mime->setHTMLBody($bodyhtml); } $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); //dprint_r($_REQUEST); if ($mail->send($this->email, $hdrs, $body)) { if (!$skip_html) { print "

"; printf (_("SIP settings have been sent to %s"), $this->email); } if ($_REQUEST['password_reset'] == 'on') { $this->sendPasswordReset($skip_html); } return 1; } } function sendChangedEmail($skip_html=False, $fields=array()) { dprint("SipSettings->sendChangedEmail($this->email)"); //dprint_r($fields); $this->ip = $_SERVER['REMOTE_ADDR']; if (!$this->email && !$skip_html) { print "

"; print _("Please fill in the e-mail address. "); print ""; return false; } //$this->location = "Unknown"; $_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR']); if ($_loc['country_name']) { $this->location = $_loc['country_name']; } $subject = sprintf("SIP Account %s changed",$this->account); $tpl = $this->getChangedEmailTemplate($this->reseller, $this->Preferences['language']); if (!$tpl && !$skip_html) { print "

"; print _("Error: no email template found"); print ""; return false; } $tpl_html = $this->getChangedEmailTemplateHTML($this->reseller, $this->Preferences['language']); $this->includeSmarty(); $smarty = new Smarty; $smarty->template_dir = '.'; //$smarty->use_sub_dirs = true; //$smarty->cache_dir = 'templates_c'; $this->fields = $fields; $smarty->assign('client', $this); $bodyt = $smarty->fetch($tpl); if ($tpl_html) { $bodyhtml = $smarty->fetch($tpl_html); } include_once 'Mail.php'; include_once 'Mail/mime.php' ; $hdrs = array( 'From' => $this->support_email, 'Subject' => $subject ); $crlf = "\n"; $mime = new Mail_mime($crlf); $mime->setTXTBody($bodyt); if ($tpl_html) { $mime->setHTMLBody($bodyhtml); } $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); //dprint_r($_REQUEST); if ($mail->send($this->email, $hdrs, $body)) { return 1; } } function sendRemoveAccount() { $this->ip = $_SERVER['REMOTE_ADDR']; $subject = sprintf("The account %s was removed from IP Address: %s",$this->account, $this->ip); syslog(LOG_NOTICE, $subject); } function sendPasswordReset($skip_html=False) { dprint("SipSettings->sendPasswordEmail($this->email)"); $identifier = RandomIdentifier(); $this->db = new DB_CDRTool(); $this->ip = $_SERVER['REMOTE_ADDR']; $insert_data = array ( 'sip_account' => $this->account, 'email' => $this->email, 'ip' => $this->ip ); $this->expire = date("Y-m-d H:i:s",strtotime("+30 minutes")); $query = sprintf( "insert into memcache set `key`='email_%s', `value`='%s', `expire`='%s'", $identifier, json_encode($insert_data), $this->expire ); $this->db->query($query); $this->identifier = $identifier; dprint("$query
Identifier: $identifier"); if (!$this->email && !$skip_html) { print "

"; print _("Please fill in the e-mail address. "); print ""; return false; } $subject = sprintf("Password reset for %s", $this->account); $tpl_html = $this->getEmailPasswordTemplateHTML($this->reseller, $this->Preferences['language']); $this->includeSmarty(); $smarty = new Smarty; $smarty->template_dir = '.'; //$smarty->use_sub_dirs = true; //$smarty->cache_dir = 'templates_c'; $smarty->assign('client', $this); $bodyhtml = $smarty->fetch($tpl_html); include_once 'Mail.php'; include_once 'Mail/mime.php' ; $hdrs = array( 'From' => $this->support_email, 'Subject' => $subject ); $crlf = "\n"; $mime = new Mail_mime($crlf); $mime->setHTMLBody($bodyhtml); $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); //dprint_r($_REQUEST); if ($mail->send($this->email, $hdrs, $body) && !$skip_html) { print "

  • "; printf (_("Password reset has been sent to %s"), $this->email); print "
  • "; } return 1; } function checkSettings() { dprint("checkSettings()"); foreach ($this->form_elements as $el) { ${$el} = trim($_REQUEST[$el]); } if ($accept_temporary_remain && !is_numeric($accept_temporary_remain)) { $this->error = _("Invalid Expiration Period"); return false; } if ($quota && !is_numeric($quota) && !is_float($quota)) { $this->error = _("Invalid Quota"); return false; } if (!$timezone && !$this->timezone) { $this->error = _("Missing Timezone"); return false; } if (!$this->checkEmail($mailto)) { $this->error = _("Invalid E-mail Address"); return false; } $rpid = preg_replace("/[^0-9\x]/", "", $rpid); if (preg_match("/^0+([1-9]\d*)$/", $rpid, $m)) $rpid=$m[1]; $quickdial = preg_replace("/[^0-9]/", "", $quickdial); if (!strlen($accept_temporary_group)) $accept_temporary_remain = 0; if (!$accept_temporary_remain) $accept_temporary_group = ""; if (!$anonymous) $anonymous = "0"; return true; } function RandomPassword($len=6) { $alf=array("1","2","3","4","5","6","7","8","9"); $i=0; while($i < $len) { srand((double)microtime(true)*1000000); $randval = rand(0,8); $string="$string"."$alf[$randval]"; $i++; } return $string; } function cleanURI($uri) { $uri=preg_replace("/.*sips?:([^;><=]+).*/", "\$1", $uri); return urlencode($uri); } function showUpgradeTab () { } function PhoneDialURL($uri) { $uri=$this->normalizeURI($uri); if (!preg_match("/^sip:/",$uri)) { $uri="sip:".$uri; } $uri_print="$this->call_img"; return $uri_print; } function showChapter($chapter) { print "

    "; print $chapter; print "

    "; } function normalizeURI($uri) { $uri=quoted_printable_decode($uri); $uri=preg_replace("/.*(sips?:[^;><=]+).*/", "\$1", $uri); if (preg_match("/^(sips?:.*):/", $uri, $m)) $uri=$m[1]; if (preg_match("/^(.*sips?:0\d+)@(.*)(>?)$/",$uri,$m)) { $uri=$m[1]."@".$this->domain.$m[3]; } return $uri; } function htmlURI($uri) { if (preg_match("/^sips?:00(\d+)@/",$uri,$m)) { $uri="+".$m[1]; } return htmlentities($uri); } function colorizeDate($call_date) { list($date,$time)=explode(" ",$call_date); if ($date== Date("Y-m-d",time())) { $datePrint="".sprintf(_("Today"))." ".$time; } else if ($date== Date("Y-m-d",time()-3600*24)) { $datePrint="".sprintf(_("Yesterday"))." ".$time; } else { $datePrint=$call_date; } return $datePrint; } function checkEmail($email) { dprint ("checkEmail($email)"); $regexp = "/^([a-z0-9][a-z0-9_.-]*)@([a-z0-9][a-z0-9-]*\.)+([a-z]{2,})$/i"; if (stristr($email,"-.") || !preg_match($regexp, $email)) { return false; } return true; } function getFileTemplate($name, $type="file") { dprint("getFileTemplate(name=$name, type=$type, path=$this->templates_path)"); if ($type=='logo') { $extensions=array('png','gif','jpg'); foreach ($extensions as $_ext) { $file=$this->templates_path.'/'.$this->reseller.'/'.$name.'.'.$_ext; if (file_exists($file)) { return $file; } } foreach ($extensions as $_ext) { if (file_exists("$this->templates_path/default/$name.$_ext")) { return "$this->templates_path/default/$name.$_ext"; } } return false; } else { if (file_exists("$this->templates_path/$this->reseller/$name")) { return "$this->templates_path/$this->reseller/$name"; } elseif (file_exists("$this->templates_path/default/$name")) { return "$this->templates_path/default/$name"; } else { return false; } } } function getEmailTemplate($reseller, $language='en') { $file = "sip_settings_email_$language.tpl"; $file2 = "sip_settings_email.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getEmailTemplateHTML($reseller, $language='en') { $file = "sip_settings_email_$language.html.tpl"; $file2 = "sip_settings_email.html.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getChangedEmailTemplate($reseller, $language='en') { $file = "sip_settings_changed_$language.tpl"; $file2 = "sip_settings_changed.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getChangedEmailTemplateHTML($reseller, $language='en') { $file = "sip_settings_changed_$language.html.tpl"; $file2 = "sip_settings_changed.html.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getEmailPasswordTemplateHTML($reseller, $language='en') { $file = "password_reminder_$language.html.tpl"; $file2 = "password_reminder.html.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getEmailDeleteTemplateHTML($reseller, $language='en') { $file = "delete_$language.html.tpl"; $file2 = "delete.html.tpl"; //print("templates_path = $this->templates_path"); if (file_exists("$this->templates_path/$this->reseller/$file")) { return "$this->templates_path/$this->reseller/$file"; } elseif (file_exists("$this->templates_path/$this->reseller/$file2")) { return "$this->templates_path/$this->reseller/$file2"; } elseif (file_exists("$this->templates_path/default/$file")) { return "$this->templates_path/default/$file"; } elseif (file_exists("$this->templates_path/default/$file2")) { return "$this->templates_path/default/$file2"; } else { return false; } } function getBillingProfiles() { dprint("getBillingProfiles()"); // Get getBillingProfiles $this->RatingPort->addHeader($this->SoapAuthRating); $result = $this->RatingPort->getEntityProfiles("subscriber://".$this->account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "4001") { printf ("

    Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } $this->billingProfiles=$result; } function showBillingProfiles() { if ($this->login_type != 'reseller' && $this->login_type != 'admin') { return false; } if (!$this->pstn_changes_allowed) { return false; } $this->getBillingProfiles(); $chapter=sprintf(_("Billing Profiles")); $this->showChapter($chapter); print "

    / ", $this->billingProfiles->profileWeekday, $this->billingProfiles->profileWeekdayAlt ); print "
    "; print "
    / ", $this->billingProfiles->profileWeekend, $this->billingProfiles->profileWeekendAlt ); print "
    "; print "
    "); if ($this->billingProfiles->timezone) { $_timezone=$this->billingProfiles->timezone; } else { $_timezone=$this->resellerProperties['timezone']; } $this->showTimezones('profileTimezone',$_timezone); print "
    "; } function updateBillingProfiles() { if ($this->login_type != 'reseller' && $this->login_type != 'admin') { return false; } if (!$this->pstn_changes_allowed) { return true; } $this->RatingPort->addHeader($this->SoapAuthRating); $result = $this->RatingPort->getEntityProfiles("subscriber://".$this->account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "4001") { printf ("

    Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } $this->billingProfiles=$result; $profiles=array("entity" =>'subscriber://'.$this->account , "profileWeekday" => trim($_REQUEST['profileWeekday']), "profileWeekdayAlt" => trim($_REQUEST['profileWeekdayAlt']), "profileWeekend" => trim($_REQUEST['profileWeekend']), "profileWeekendAlt" => trim($_REQUEST['profileWeekendAlt']), "timezone" => trim($_REQUEST['profileTimezone']) ); //print_r($profiles); $this->RatingPort->addHeader($this->SoapAuthRating); if ($this->billingProfiles->profileWeekday && !$profiles['profileWeekday']) { // delete profile $result = $this->RatingPort->deleteEntityProfiles('subscriber://'.$this->account); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "4001") { printf ("

    Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } } else if ($profiles['profileWeekday']) { // update profile $result = $this->RatingPort->setEntityProfiles($profiles); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode != "4001") { printf ("

    Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } } } } function getImageForUserAgent($agent) { // array with mappings between User Agents and images foreach ($this->userAgentImages as $agentRegexp => $image) { if (preg_match("/$agentRegexp/i", $agent)) { return $image; } } return "unknown.png"; } function showExtraGroups () { if ($this->disable_extra_groups) return true; $foundGroupInAvailableGroups=array(); foreach ($this->groups as $_grp) { foreach (array_keys($this->availableGroups) as $a_grp) { if ($_grp == $a_grp) $foundGroupInAvailableGroups[]=$_grp; continue; } } $extraGroups = array_unique(array_diff($this->groups,$foundGroupInAvailableGroups)); foreach ($extraGroups as $_eg) { $extraGroups_text.=$_eg.' '; } if ($this->login_type == 'subscriber') { printf ("",trim($extraGroups_text)); } else { print "

    "; printf ("",trim($extraGroups_text)); print "
    "; } } function generateCertificate() { global $enrollment; include("/etc/cdrtool/enrollment/config.ini"); if (!is_array($enrollment)) { print _("Error: missing enrollment settings"); return false; } if (!$enrollment['ca_conf']) { //print _("Error: missing enrollment ca_conf settings"); return false; } if (!$this->owner) { return false; } if (!$enrollment['ca_crt']) { //print _("Error: missing enrollment ca_crt settings"); return false; } if (!$enrollment['ca_key']) { //print _("Error: missing enrollment ca_key settings"); return false; } $config = array( 'config' => $enrollment['ca_conf'], 'digest_alg' => 'md5', 'private_key_bits' => 1024, 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'encrypt_key' => false, ); $dn = array( "countryName" => "NL", "stateOrProvinceName" => "Noord Holland", "localityName" => "Haarlem", "organizationName" => "AG Projects", "organizationalUnitName" => "Blink", "commonName" => $this->owner, "emailAddress" => $this->email ); $this->key = openssl_pkey_new($config); if ($this->key==FALSE) { while (($e = openssl_error_string()) !== false) { echo $e . "\n"; print "

    "; } return false; } $this->csr = openssl_csr_new($dn, $this->key); if (!$this->csr) { while (($e = openssl_error_string()) !== false) { echo $e . "\n"; print "

    "; } return false; } $ca="file://".$enrollment['ca_crt']; $this->crt = openssl_csr_sign($this->csr, $ca, $enrollment['ca_key'], 3650, $config); if ($this->crt==FALSE) { while (($e = openssl_error_string()) !== false) { echo $e . "\n"; print "

    "; } return false; } openssl_csr_export ($this->csr, $this->csr_out); openssl_pkey_export ($this->key, $this->key_out, $this->password, $config); openssl_x509_export ($this->crt, $this->crt_out); openssl_pkcs12_export ($this->crt, $this->p12_out, $this->key, $this->password); $ret=array( 'csr' => $this->csr_out, 'crt' => $this->crt_out, 'key' => $this->key_out, 'pkey'=> $public_key, 'p12' => $this->p12_out, 'ca' => file_get_contents($enrollment['ca_crt']) ); return $ret; } function exportCertificateX509() { if (!$this->owner) return; Header("Content-type: application/x-crt"); $header=sprintf("Content-Disposition: inline; filename=sipthor-owner-certificate-%s.crt",$this->owner); Header($header); $cert=$this->generateCertificate(); $crt=$cert['crt'].$cert['key']; print $crt; } function exportCertificateP12() { if (!$this->owner) return; $cert=$this->generateCertificate(); Header("Content-type: application/x-p12"); $header=sprintf("Content-Disposition: inline; filename=sipthor-owner-certificate-%s.p12",$this->owner); Header($header); print $cert['p12']; } function isEmbedded() { // return true if page was loaded from non-session based web session if ($_SERVER['SSL_CLIENT_CERT'] || $_SERVER['PHP_AUTH_DIGEST']) { return true; } return false; } function changeLanguage($lang='en',$domain='cdrtool') { // run dpkg-reconfigure locales and select support languages .utf8 $lang = $this->languageCodeFor(isset($lang) ? $lang : 'en'); $lang.='.utf8'; setlocale(LC_ALL, $lang); bindtextdomain($domain, '/var/www/CDRTool/po/locale'); bind_textdomain_codeset($domain,'UTF-8'); textdomain($domain); } // return full language code for given 2 letter language code function languageCodeFor($lang='en') { $lang = isset($lang) ? strtolower($lang) : 'en'; switch ($lang) { case 'en': return 'en_US'; // this can be C or en_US case 'ja': return 'ja_JP'; default : return ($lang . '_' . strtoupper($lang)); } return 'C'; // this will never be reached } function showDirectorySearchForm () { if (in_array("trunking",$this->groups)) { return false; } print "
    url method=post> "; print $this->hiddenElements; print "
    "; print " ",$_REQUEST['firstname']); print "
    "; print "",$_REQUEST['lastname']); print ""; print "
    "; } function showSearchDirectory() { if (!$this->show_directory) { return false; } $this->maxrowsperpage=20; $this->showDirectorySearchForm(); if ($_REQUEST['firstname'] || $_REQUEST['lastname']) { if ($_REQUEST['firstname'] && strlen($_REQUEST['firstname']) < 3) { return false; } if ($_REQUEST['lastname'] && strlen($_REQUEST['lastname']) < 3) { return false; } } else { return false; } $this->next = $_REQUEST['next']; // Filter $filter=array('firstName'=> trim($_REQUEST['firstname']), 'lastName' => trim($_REQUEST['lastname']) ); // Range $range=array('start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SipPort->addHeader($this->SoapAuthAdmin); // Call function $result = $this->SipPort->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } $this->rows = $result->total; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows=$this->rows; } if ($this->rows) { print "

    "; printf(_("%s contacts found. "),$this->rows); if ($this->isEmbedded()) { //printf (_("Click on %s to add a Contact to Blink. "),$this->plus_sign_img); } print "
    "; print ""; print ""; print ""; print ""; print " "; $i=0; while ($i < $maxrows) { if (!$result->accounts[$i]) break; $account = $result->accounts[$i]; $index=$this->next+$i+1; $rr=floor($index/2); $mod=$index-$rr*2; if ($mod ==0) { $_class='odd'; } else { $_class='even'; } $i++; $name=$account->firstName.' '.$account->lastName; $sip_account=sprintf("%s@%s",$account->id->username,$account->id->domain); $contacts_url=sprintf("%s",$this->url,$sip_account,urlencode($name),$sip_account,$this->phonebook_img); if ($this->isEmbedded()) { //$add_contact_url=sprintf("%s",$sip_account,$name,$this->plus_sign_img); printf ("", $_class, $index, $name, $sip_account, $account->timezone, $this->PhoneDialURL($sip_account), $add_contact_url ); } else { printf ("", $_class, $index, $name, $sip_account, $account->timezone, $this->PhoneDialURL($sip_account), $contacts_url ); } } print "
    "; print _('Display Name'); print ""; print _('SIP Address'); print ""; print _('Timezone'); print ""; print _('Action'); print "
    %d%s%s%s%s %s
    %d%s%s%s%s %s
    "; $this->showPagination($maxrows); return true; } } function showPagination($maxrows) { $url = sprintf("%s&tab=%s&firstname=%s&lastname%s", $this->url, $this->tab, urlencode($_REQUEST['firstname']), urlencode($_REQUEST['lastname']) ); print "

    "; if ($this->next != 0 ) { $show_next=$this->maxrowsperpage-$this->next; if ($show_next < 0) { $mod_show_next = $show_next-2*$show_next; } if (!$mod_show_next) $mod_show_next=0; if ($mod_show_next/$this->maxrowsperpage >= 1) { printf ("Begin ",$url); } printf ("Previous ",$url,$mod_show_next); } print " "; if ($this->next + $this->maxrowsperpage < $this->rows) { $show_next = $this->maxrowsperpage + $this->next; printf ("Next ",$url,$show_next); } print "
    "; } } function lookupGeoLocation($ip) { if ($_loc=geoip_record_by_name($ip)) { $_loc['timezone'] = get_time_zone($_loc['country_code'], $_loc['region']); $_loc['region'] = get_region($_loc['country_code'], $_loc['region']); $country_transition = array( "A1" => "N/A", "A2" => "N/A", "O1" => "N/A", "AP" => "N/A", "GB" => "UK"); if (array_key_exists($_loc['country_code'],$country_transition)) { $_loc['country_code'] = $country_transition[$_loc['country_code']]; } return $_loc; } else { return array(); } } function get_region($country, $region) { if ($country == "US" || $country =="CA" ) { $full_region = $region; // If region can't be found make it a default region to prevent NGNpro error if ($full_region == '' && $country == "US") { $full_region = "NY"; } else if ($full_region == '' && $country == "CA") { $full_region = "QC"; } } else { $full_region=''; } return $full_region; } function get_time_zone($country, $region) { switch ($country) { case "US": switch ($region) { case "AL": $timezone = "America/Chicago"; break; case "AK": $timezone = "America/Anchorage"; break; case "AZ": $timezone = "America/Phoenix"; break; case "AR": $timezone = "America/Chicago"; break; case "CA": $timezone = "America/Los_Angeles"; break; case "CO": $timezone = "America/Denver"; break; case "CT": $timezone = "America/New_York"; break; case "DE": $timezone = "America/New_York"; break; case "DC": $timezone = "America/New_York"; break; case "FL": $timezone = "America/New_York"; break; case "GA": $timezone = "America/New_York"; break; case "HI": $timezone = "Pacific/Honolulu"; break; case "ID": $timezone = "America/Denver"; break; case "IL": $timezone = "America/Chicago"; break; case "IN": $timezone = "America/Indianapolis"; break; case "IA": $timezone = "America/Chicago"; break; case "KS": $timezone = "America/Chicago"; break; case "KY": $timezone = "America/New_York"; break; case "LA": $timezone = "America/Chicago"; break; case "ME": $timezone = "America/New_York"; break; case "MD": $timezone = "America/New_York"; break; case "MA": $timezone = "America/New_York"; break; case "MI": $timezone = "America/New_York"; break; case "MN": $timezone = "America/Chicago"; break; case "MS": $timezone = "America/Chicago"; break; case "MO": $timezone = "America/Chicago"; break; case "MT": $timezone = "America/Denver"; break; case "NE": $timezone = "America/Chicago"; break; case "NV": $timezone = "America/Los_Angeles"; break; case "NH": $timezone = "America/New_York"; break; case "NJ": $timezone = "America/New_York"; break; case "NM": $timezone = "America/Denver"; break; case "NY": $timezone = "America/New_York"; break; case "NC": $timezone = "America/New_York"; break; case "ND": $timezone = "America/Chicago"; break; case "OH": $timezone = "America/New_York"; break; case "OK": $timezone = "America/Chicago"; break; case "OR": $timezone = "America/Los_Angeles"; break; case "PA": $timezone = "America/New_York"; break; case "RI": $timezone = "America/New_York"; break; case "SC": $timezone = "America/New_York"; break; case "SD": $timezone = "America/Chicago"; break; case "TN": $timezone = "America/Chicago"; break; case "TX": $timezone = "America/Chicago"; break; case "UT": $timezone = "America/Denver"; break; case "VT": $timezone = "America/New_York"; break; case "VA": $timezone = "America/New_York"; break; case "WA": $timezone = "America/Los_Angeles"; break; case "WV": $timezone = "America/New_York"; break; case "WI": $timezone = "America/Chicago"; break; case "WY": $timezone = "America/Denver"; break; } break; case "CA": switch ($region) { case "AB": $timezone = "America/Edmonton"; break; case "BC": $timezone = "America/Vancouver"; break; case "MB": $timezone = "America/Winnipeg"; break; case "NB": $timezone = "America/Halifax"; break; case "NL": $timezone = "America/St_Johns"; break; case "NT": $timezone = "America/Yellowknife"; break; case "NS": $timezone = "America/Halifax"; break; case "NU": $timezone = "America/Rankin_Inlet"; break; case "ON": $timezone = "America/Rainy_River"; break; case "PE": $timezone = "America/Halifax"; break; case "QC": $timezone = "America/Montreal"; break; case "SK": $timezone = "America/Regina"; break; case "YT": $timezone = "America/Whitehorse"; break; } break; case "AU": switch ($region) { case "01": $timezone = "Australia/Canberra"; break; case "02": $timezone = "Australia/NSW"; break; case "03": $timezone = "Australia/North"; break; case "04": $timezone = "Australia/Queensland"; break; case "05": $timezone = "Australia/South"; break; case "06": $timezone = "Australia/Tasmania"; break; case "07": $timezone = "Australia/Victoria"; break; case "08": $timezone = "Australia/West"; break; } break; case "AS": $timezone = "US/Samoa"; break; case "CI": $timezone = "Africa/Abidjan"; break; case "GH": $timezone = "Africa/Accra"; break; case "DZ": $timezone = "Africa/Algiers"; break; case "ER": $timezone = "Africa/Asmera"; break; case "ML": $timezone = "Africa/Bamako"; break; case "CF": $timezone = "Africa/Bangui"; break; case "GM": $timezone = "Africa/Banjul"; break; case "GW": $timezone = "Africa/Bissau"; break; case "CG": $timezone = "Africa/Brazzaville"; break; case "BI": $timezone = "Africa/Bujumbura"; break; case "EG": $timezone = "Africa/Cairo"; break; case "MA": $timezone = "Africa/Casablanca"; break; case "GN": $timezone = "Africa/Conakry"; break; case "SN": $timezone = "Africa/Dakar"; break; case "DJ": $timezone = "Africa/Djibouti"; break; case "SL": $timezone = "Africa/Freetown"; break; case "BW": $timezone = "Africa/Gaborone"; break; case "ZW": $timezone = "Africa/Harare"; break; case "ZA": $timezone = "Africa/Johannesburg"; break; case "UG": $timezone = "Africa/Kampala"; break; case "SD": $timezone = "Africa/Khartoum"; break; case "RW": $timezone = "Africa/Kigali"; break; case "NG": $timezone = "Africa/Lagos"; break; case "GA": $timezone = "Africa/Libreville"; break; case "TG": $timezone = "Africa/Lome"; break; case "AO": $timezone = "Africa/Luanda"; break; case "ZM": $timezone = "Africa/Lusaka"; break; case "GQ": $timezone = "Africa/Malabo"; break; case "MZ": $timezone = "Africa/Maputo"; break; case "LS": $timezone = "Africa/Maseru"; break; case "SZ": $timezone = "Africa/Mbabane"; break; case "SO": $timezone = "Africa/Mogadishu"; break; case "LR": $timezone = "Africa/Monrovia"; break; case "KE": $timezone = "Africa/Nairobi"; break; case "TD": $timezone = "Africa/Ndjamena"; break; case "NE": $timezone = "Africa/Niamey"; break; case "MR": $timezone = "Africa/Nouakchott"; break; case "BF": $timezone = "Africa/Ouagadougou"; break; case "ST": $timezone = "Africa/Sao_Tome"; break; case "LY": $timezone = "Africa/Tripoli"; break; case "TN": $timezone = "Africa/Tunis"; break; case "AI": $timezone = "America/Anguilla"; break; case "AG": $timezone = "America/Antigua"; break; case "AW": $timezone = "America/Aruba"; break; case "BB": $timezone = "America/Barbados"; break; case "BZ": $timezone = "America/Belize"; break; case "CO": $timezone = "America/Bogota"; break; case "VE": $timezone = "America/Caracas"; break; case "KY": $timezone = "America/Cayman"; break; case "CR": $timezone = "America/Costa_Rica"; break; case "DM": $timezone = "America/Dominica"; break; case "SV": $timezone = "America/El_Salvador"; break; case "GD": $timezone = "America/Grenada"; break; case "FR": $timezone = "Europe/Paris"; break; case "GP": $timezone = "America/Guadeloupe"; break; case "GT": $timezone = "America/Guatemala"; break; case "GY": $timezone = "America/Guyana"; break; case "CU": $timezone = "America/Havana"; break; case "JM": $timezone = "America/Jamaica"; break; case "BO": $timezone = "America/La_Paz"; break; case "PE": $timezone = "America/Lima"; break; case "NI": $timezone = "America/Managua"; break; case "MQ": $timezone = "America/Martinique"; break; case "UY": $timezone = "America/Montevideo"; break; case "MS": $timezone = "America/Montserrat"; break; case "BS": $timezone = "America/Nassau"; break; case "PA": $timezone = "America/Panama"; break; case "SR": $timezone = "America/Paramaribo"; break; case "PR": $timezone = "America/Puerto_Rico"; break; case "KN": $timezone = "America/St_Kitts"; break; case "LC": $timezone = "America/St_Lucia"; break; case "VC": $timezone = "America/St_Vincent"; break; case "HN": $timezone = "America/Tegucigalpa"; break; case "YE": $timezone = "Asia/Aden"; break; case "JO": $timezone = "Asia/Amman"; break; case "TM": $timezone = "Asia/Ashgabat"; break; case "IQ": $timezone = "Asia/Baghdad"; break; case "BH": $timezone = "Asia/Bahrain"; break; case "AZ": $timezone = "Asia/Baku"; break; case "TH": $timezone = "Asia/Bangkok"; break; case "LB": $timezone = "Asia/Beirut"; break; case "KG": $timezone = "Asia/Bishkek"; break; case "BN": $timezone = "Asia/Brunei"; break; case "IN": $timezone = "Asia/Calcutta"; break; case "MN": $timezone = "Asia/Choibalsan"; break; case "LK": $timezone = "Asia/Colombo"; break; case "BD": $timezone = "Asia/Dhaka"; break; case "AE": $timezone = "Asia/Dubai"; break; case "TJ": $timezone = "Asia/Dushanbe"; break; case "HK": $timezone = "Asia/Hong_Kong"; break; case "TR": $timezone = "Asia/Istanbul"; break; case "IL": $timezone = "Asia/Jerusalem"; break; case "AF": $timezone = "Asia/Kabul"; break; case "PK": $timezone = "Asia/Karachi"; break; case "NP": $timezone = "Asia/Katmandu"; break; case "KW": $timezone = "Asia/Kuwait"; break; case "MO": $timezone = "Asia/Macao"; break; case "PH": $timezone = "Asia/Manila"; break; case "OM": $timezone = "Asia/Muscat"; break; case "CY": $timezone = "Asia/Nicosia"; break; case "KP": $timezone = "Asia/Pyongyang"; break; case "QA": $timezone = "Asia/Qatar"; break; case "MM": $timezone = "Asia/Rangoon"; break; case "SA": $timezone = "Asia/Riyadh"; break; case "KR": $timezone = "Asia/Seoul"; break; case "SG": $timezone = "Asia/Singapore"; break; case "TW": $timezone = "Asia/Taipei"; break; case "GE": $timezone = "Asia/Tbilisi"; break; case "BT": $timezone = "Asia/Thimphu"; break; case "JP": $timezone = "Asia/Tokyo"; break; case "LA": $timezone = "Asia/Vientiane"; break; case "AM": $timezone = "Asia/Yerevan"; break; case "BM": $timezone = "Atlantic/Bermuda"; break; case "CV": $timezone = "Atlantic/Cape_Verde"; break; case "FO": $timezone = "Atlantic/Faeroe"; break; case "IS": $timezone = "Atlantic/Reykjavik"; break; case "GS": $timezone = "Atlantic/South_Georgia"; break; case "SH": $timezone = "Atlantic/St_Helena"; break; case "CL": $timezone = "Chile/Continental"; break; case "NL": $timezone = "Europe/Amsterdam"; break; case "AD": $timezone = "Europe/Andorra"; break; case "GR": $timezone = "Europe/Athens"; break; case "YU": $timezone = "Europe/Belgrade"; break; case "DE": $timezone = "Europe/Berlin"; break; case "SK": $timezone = "Europe/Bratislava"; break; case "BE": $timezone = "Europe/Brussels"; break; case "RO": $timezone = "Europe/Bucharest"; break; case "HU": $timezone = "Europe/Budapest"; break; case "DK": $timezone = "Europe/Copenhagen"; break; case "IE": $timezone = "Europe/Dublin"; break; case "GI": $timezone = "Europe/Gibraltar"; break; case "FI": $timezone = "Europe/Helsinki"; break; case "SI": $timezone = "Europe/Ljubljana"; break; case "GB": $timezone = "Europe/London"; break; case "LU": $timezone = "Europe/Luxembourg"; break; case "MT": $timezone = "Europe/Malta"; break; case "BY": $timezone = "Europe/Minsk"; break; case "MC": $timezone = "Europe/Monaco"; break; case "NO": $timezone = "Europe/Oslo"; break; case "CZ": $timezone = "Europe/Prague"; break; case "LV": $timezone = "Europe/Riga"; break; case "IT": $timezone = "Europe/Rome"; break; case "SM": $timezone = "Europe/San_Marino"; break; case "BA": $timezone = "Europe/Sarajevo"; break; case "MK": $timezone = "Europe/Skopje"; break; case "BG": $timezone = "Europe/Sofia"; break; case "SE": $timezone = "Europe/Stockholm"; break; case "EE": $timezone = "Europe/Tallinn"; break; case "AL": $timezone = "Europe/Tirane"; break; case "LI": $timezone = "Europe/Vaduz"; break; case "VA": $timezone = "Europe/Vatican"; break; case "AT": $timezone = "Europe/Vienna"; break; case "LT": $timezone = "Europe/Vilnius"; break; case "PL": $timezone = "Europe/Warsaw"; break; case "HR": $timezone = "Europe/Zagreb"; break; case "IR": $timezone = "Asia/Tehran"; break; case "MG": $timezone = "Indian/Antananarivo"; break; case "CX": $timezone = "Indian/Christmas"; break; case "CC": $timezone = "Indian/Cocos"; break; case "KM": $timezone = "Indian/Comoro"; break; case "MV": $timezone = "Indian/Maldives"; break; case "MU": $timezone = "Indian/Mauritius"; break; case "YT": $timezone = "Indian/Mayotte"; break; case "RE": $timezone = "Indian/Reunion"; break; case "FJ": $timezone = "Pacific/Fiji"; break; case "TV": $timezone = "Pacific/Funafuti"; break; case "GU": $timezone = "Pacific/Guam"; break; case "NR": $timezone = "Pacific/Nauru"; break; case "NU": $timezone = "Pacific/Niue"; break; case "NF": $timezone = "Pacific/Norfolk"; break; case "PW": $timezone = "Pacific/Palau"; break; case "PN": $timezone = "Pacific/Pitcairn"; break; case "CK": $timezone = "Pacific/Rarotonga"; break; case "WS": $timezone = "Pacific/Samoa"; break; case "KI": $timezone = "Pacific/Tarawa"; break; case "TO": $timezone = "Pacific/Tongatapu"; break; case "WF": $timezone = "Pacific/Wallis"; break; case "TZ": $timezone = "Africa/Dar_es_Salaam"; break; case "VN": $timezone = "Asia/Phnom_Penh"; break; case "KH": $timezone = "Asia/Phnom_Penh"; break; case "CM": $timezone = "Africa/Lagos"; break; case "DO": $timezone = "America/Santo_Domingo"; break; case "ET": $timezone = "Africa/Addis_Ababa"; break; case "FX": $timezone = "Europe/Paris"; break; case "HT": $timezone = "America/Port-au-Prince"; break; case "CH": $timezone = "Europe/Zurich"; break; case "AN": $timezone = "America/Curacao"; break; case "BJ": $timezone = "Africa/Porto-Novo"; break; case "EH": $timezone = "Africa/El_Aaiun"; break; case "FK": $timezone = "Atlantic/Stanley"; break; case "GF": $timezone = "America/Cayenne"; break; case "IO": $timezone = "Indian/Chagos"; break; case "MD": $timezone = "Europe/Chisinau"; break; case "MP": $timezone = "Pacific/Saipan"; break; case "MW": $timezone = "Africa/Blantyre"; break; case "NA": $timezone = "Africa/Windhoek"; break; case "NC": $timezone = "Pacific/Noumea"; break; case "PG": $timezone = "Pacific/Port_Moresby"; break; case "PM": $timezone = "America/Miquelon"; break; case "PS": $timezone = "Asia/Gaza"; break; case "PY": $timezone = "America/Asuncion"; break; case "SB": $timezone = "Pacific/Guadalcanal"; break; case "SC": $timezone = "Indian/Mahe"; break; case "SJ": $timezone = "Arctic/Longyearbyen"; break; case "SY": $timezone = "Asia/Damascus"; break; case "TC": $timezone = "America/Grand_Turk"; break; case "TF": $timezone = "Indian/Kerguelen"; break; case "TK": $timezone = "Pacific/Fakaofo"; break; case "TT": $timezone = "America/Port_of_Spain"; break; case "VG": $timezone = "America/Tortola"; break; case "VI": $timezone = "America/St_Thomas"; break; case "VU": $timezone = "Pacific/Efate"; break; case "RS": $timezone = "Europe/Belgrade"; break; case "ME": $timezone = "Europe/Podgorica"; break; case "AX": $timezone = "Europe/Mariehamn"; break; case "GG": $timezone = "Europe/Guernsey"; break; case "IM": $timezone = "Europe/Isle_of_Man"; break; case "JE": $timezone = "Europe/Jersey"; break; case "BL": $timezone = "America/St_Barthelemy"; break; case "MF": $timezone = "America/Marigot"; break; case "AR": switch ($region) { case "01": $timezone = "America/Argentina/Buenos_Aires"; break; case "02": $timezone = "America/Argentina/Catamarca"; break; case "03": $timezone = "America/Argentina/Tucuman"; break; case "04": $timezone = "America/Argentina/Rio_Gallegos"; break; case "05": $timezone = "America/Argentina/Cordoba"; break; case "06": $timezone = "America/Argentina/Tucuman"; break; case "07": $timezone = "America/Argentina/Buenos_Aires"; break; case "08": $timezone = "America/Argentina/Buenos_Aires"; break; case "09": $timezone = "America/Argentina/Tucuman"; break; case "10": $timezone = "America/Argentina/Jujuy"; break; case "11": $timezone = "America/Argentina/San_Luis"; break; case "12": $timezone = "America/Argentina/La_Rioja"; break; case "13": $timezone = "America/Argentina/Mendoza"; break; case "14": $timezone = "America/Argentina/Buenos_Aires"; break; case "15": $timezone = "America/Argentina/San_Luis"; break; case "16": $timezone = "America/Argentina/Buenos_Aires"; break; case "17": $timezone = "America/Argentina/Salta"; break; case "18": $timezone = "America/Argentina/San_Juan"; break; case "19": $timezone = "America/Argentina/San_Luis"; break; case "20": $timezone = "America/Argentina/Rio_Gallegos"; break; case "21": $timezone = "America/Argentina/Buenos_Aires"; break; case "22": $timezone = "America/Argentina/Catamarca"; break; case "23": $timezone = "America/Argentina/Ushuaia"; break; case "24": $timezone = "America/Argentina/Tucuman"; break; } break; case "BR": switch ($region) { case "01": $timezone = "America/Rio_Branco"; break; case "02": $timezone = "America/Maceio"; break; case "03": $timezone = "America/Sao_Paulo"; break; case "04": $timezone = "America/Manaus"; break; case "05": $timezone = "America/Bahia"; break; case "06": $timezone = "America/Fortaleza"; break; case "07": $timezone = "America/Sao_Paulo"; break; case "08": $timezone = "America/Sao_Paulo"; break; case "11": $timezone = "America/Campo_Grande"; break; case "13": $timezone = "America/Belem"; break; case "14": $timezone = "America/Cuiaba"; break; case "15": $timezone = "America/Sao_Paulo"; break; case "16": $timezone = "America/Belem"; break; case "17": $timezone = "America/Recife"; break; case "18": $timezone = "America/Sao_Paulo"; break; case "20": $timezone = "America/Fortaleza"; break; case "21": $timezone = "America/Sao_Paulo"; break; case "22": $timezone = "America/Recife"; break; case "23": $timezone = "America/Sao_Paulo"; break; case "24": $timezone = "America/Porto_Velho"; break; case "25": $timezone = "America/Boa_Vista"; break; case "26": $timezone = "America/Sao_Paulo"; break; case "27": $timezone = "America/Sao_Paulo"; break; case "28": $timezone = "America/Maceio"; break; case "29": $timezone = "America/Sao_Paulo"; break; case "30": $timezone = "America/Recife"; break; case "31": $timezone = "America/Araguaina"; break; } break; case "CD": switch ($region) { case "02": $timezone = "Africa/Kinshasa"; break; case "05": $timezone = "Africa/Lubumbashi"; break; case "06": $timezone = "Africa/Kinshasa"; break; case "08": $timezone = "Africa/Kinshasa"; break; case "10": $timezone = "Africa/Lubumbashi"; break; case "11": $timezone = "Africa/Lubumbashi"; break; case "12": $timezone = "Africa/Lubumbashi"; break; } break; case "CN": switch ($region) { case "01": $timezone = "Asia/Shanghai"; break; case "02": $timezone = "Asia/Shanghai"; break; case "03": $timezone = "Asia/Shanghai"; break; case "04": $timezone = "Asia/Shanghai"; break; case "05": $timezone = "Asia/Harbin"; break; case "06": $timezone = "Asia/Chongqing"; break; case "07": $timezone = "Asia/Shanghai"; break; case "08": $timezone = "Asia/Harbin"; break; case "09": $timezone = "Asia/Shanghai"; break; case "10": $timezone = "Asia/Shanghai"; break; case "11": $timezone = "Asia/Chongqing"; break; case "12": $timezone = "Asia/Shanghai"; break; case "13": $timezone = "Asia/Urumqi"; break; case "14": $timezone = "Asia/Chongqing"; break; case "15": $timezone = "Asia/Chongqing"; break; case "16": $timezone = "Asia/Chongqing"; break; case "18": $timezone = "Asia/Chongqing"; break; case "19": $timezone = "Asia/Harbin"; break; case "20": $timezone = "Asia/Harbin"; break; case "21": $timezone = "Asia/Chongqing"; break; case "22": $timezone = "Asia/Harbin"; break; case "23": $timezone = "Asia/Shanghai"; break; case "24": $timezone = "Asia/Chongqing"; break; case "25": $timezone = "Asia/Shanghai"; break; case "26": $timezone = "Asia/Chongqing"; break; case "28": $timezone = "Asia/Shanghai"; break; case "29": $timezone = "Asia/Chongqing"; break; case "30": $timezone = "Asia/Chongqing"; break; case "31": $timezone = "Asia/Chongqing"; break; case "32": $timezone = "Asia/Chongqing"; break; case "33": $timezone = "Asia/Chongqing"; break; } break; case "EC": switch ($region) { case "01": $timezone = "Pacific/Galapagos"; break; case "02": $timezone = "America/Guayaquil"; break; case "03": $timezone = "America/Guayaquil"; break; case "04": $timezone = "America/Guayaquil"; break; case "05": $timezone = "America/Guayaquil"; break; case "06": $timezone = "America/Guayaquil"; break; case "07": $timezone = "America/Guayaquil"; break; case "08": $timezone = "America/Guayaquil"; break; case "09": $timezone = "America/Guayaquil"; break; case "10": $timezone = "America/Guayaquil"; break; case "11": $timezone = "America/Guayaquil"; break; case "12": $timezone = "America/Guayaquil"; break; case "13": $timezone = "America/Guayaquil"; break; case "14": $timezone = "America/Guayaquil"; break; case "15": $timezone = "America/Guayaquil"; break; case "17": $timezone = "America/Guayaquil"; break; case "18": $timezone = "America/Guayaquil"; break; case "19": $timezone = "America/Guayaquil"; break; case "20": $timezone = "America/Guayaquil"; break; case "22": $timezone = "America/Guayaquil"; break; } break; case "ES": switch ($region) { case "07": $timezone = "Europe/Madrid"; break; case "27": $timezone = "Europe/Madrid"; break; case "29": $timezone = "Europe/Madrid"; break; case "31": $timezone = "Europe/Madrid"; break; case "32": $timezone = "Europe/Madrid"; break; case "34": $timezone = "Europe/Madrid"; break; case "39": $timezone = "Europe/Madrid"; break; case "51": $timezone = "Africa/Ceuta"; break; case "52": $timezone = "Europe/Madrid"; break; case "53": $timezone = "Atlantic/Canary"; break; case "54": $timezone = "Europe/Madrid"; break; case "55": $timezone = "Europe/Madrid"; break; case "56": $timezone = "Europe/Madrid"; break; case "57": $timezone = "Europe/Madrid"; break; case "58": $timezone = "Europe/Madrid"; break; case "59": $timezone = "Europe/Madrid"; break; case "60": $timezone = "Europe/Madrid"; break; } break; case "GL": switch ($region) { case "01": $timezone = "America/Thule"; break; case "02": $timezone = "America/Godthab"; break; case "03": $timezone = "America/Godthab"; break; } break; case "ID": switch ($region) { case "01": $timezone = "Asia/Pontianak"; break; case "02": $timezone = "Asia/Makassar"; break; case "03": $timezone = "Asia/Jakarta"; break; case "04": $timezone = "Asia/Jakarta"; break; case "05": $timezone = "Asia/Jakarta"; break; case "06": $timezone = "Asia/Jakarta"; break; case "07": $timezone = "Asia/Jakarta"; break; case "08": $timezone = "Asia/Jakarta"; break; case "09": $timezone = "Asia/Jayapura"; break; case "10": $timezone = "Asia/Jakarta"; break; case "11": $timezone = "Asia/Pontianak"; break; case "12": $timezone = "Asia/Makassar"; break; case "13": $timezone = "Asia/Makassar"; break; case "14": $timezone = "Asia/Makassar"; break; case "15": $timezone = "Asia/Jakarta"; break; case "16": $timezone = "Asia/Makassar"; break; case "17": $timezone = "Asia/Makassar"; break; case "18": $timezone = "Asia/Makassar"; break; case "19": $timezone = "Asia/Pontianak"; break; case "20": $timezone = "Asia/Makassar"; break; case "21": $timezone = "Asia/Makassar"; break; case "22": $timezone = "Asia/Makassar"; break; case "23": $timezone = "Asia/Makassar"; break; case "24": $timezone = "Asia/Jakarta"; break; case "25": $timezone = "Asia/Pontianak"; break; case "26": $timezone = "Asia/Pontianak"; break; case "30": $timezone = "Asia/Jakarta"; break; case "31": $timezone = "Asia/Makassar"; break; case "33": $timezone = "Asia/Jakarta"; break; } break; case "KZ": switch ($region) { case "01": $timezone = "Asia/Almaty"; break; case "02": $timezone = "Asia/Almaty"; break; case "03": $timezone = "Asia/Qyzylorda"; break; case "04": $timezone = "Asia/Aqtobe"; break; case "05": $timezone = "Asia/Qyzylorda"; break; case "06": $timezone = "Asia/Aqtau"; break; case "07": $timezone = "Asia/Oral"; break; case "08": $timezone = "Asia/Qyzylorda"; break; case "09": $timezone = "Asia/Aqtau"; break; case "10": $timezone = "Asia/Qyzylorda"; break; case "11": $timezone = "Asia/Almaty"; break; case "12": $timezone = "Asia/Qyzylorda"; break; case "13": $timezone = "Asia/Aqtobe"; break; case "14": $timezone = "Asia/Qyzylorda"; break; case "15": $timezone = "Asia/Almaty"; break; case "16": $timezone = "Asia/Aqtobe"; break; case "17": $timezone = "Asia/Almaty"; break; } break; case "MX": switch ($region) { case "01": $timezone = "America/Mexico_City"; break; case "02": $timezone = "America/Tijuana"; break; case "03": $timezone = "America/Hermosillo"; break; case "04": $timezone = "America/Merida"; break; case "05": $timezone = "America/Mexico_City"; break; case "06": $timezone = "America/Chihuahua"; break; case "07": $timezone = "America/Monterrey"; break; case "08": $timezone = "America/Mexico_City"; break; case "09": $timezone = "America/Mexico_City"; break; case "10": $timezone = "America/Mazatlan"; break; case "11": $timezone = "America/Mexico_City"; break; case "12": $timezone = "America/Mexico_City"; break; case "13": $timezone = "America/Mexico_City"; break; case "14": $timezone = "America/Mazatlan"; break; case "15": $timezone = "America/Chihuahua"; break; case "16": $timezone = "America/Mexico_City"; break; case "17": $timezone = "America/Mexico_City"; break; case "18": $timezone = "America/Mazatlan"; break; case "19": $timezone = "America/Monterrey"; break; case "20": $timezone = "America/Mexico_City"; break; case "21": $timezone = "America/Mexico_City"; break; case "22": $timezone = "America/Mexico_City"; break; case "23": $timezone = "America/Cancun"; break; case "24": $timezone = "America/Mexico_City"; break; case "25": $timezone = "America/Mazatlan"; break; case "26": $timezone = "America/Hermosillo"; break; case "27": $timezone = "America/Merida"; break; case "28": $timezone = "America/Monterrey"; break; case "29": $timezone = "America/Mexico_City"; break; case "30": $timezone = "America/Mexico_City"; break; case "31": $timezone = "America/Merida"; break; case "32": $timezone = "America/Monterrey"; break; } break; case "MY": switch ($region) { case "01": $timezone = "Asia/Kuala_Lumpur"; break; case "02": $timezone = "Asia/Kuala_Lumpur"; break; case "03": $timezone = "Asia/Kuala_Lumpur"; break; case "04": $timezone = "Asia/Kuala_Lumpur"; break; case "05": $timezone = "Asia/Kuala_Lumpur"; break; case "06": $timezone = "Asia/Kuala_Lumpur"; break; case "07": $timezone = "Asia/Kuala_Lumpur"; break; case "08": $timezone = "Asia/Kuala_Lumpur"; break; case "09": $timezone = "Asia/Kuala_Lumpur"; break; case "11": $timezone = "Asia/Kuching"; break; case "12": $timezone = "Asia/Kuala_Lumpur"; break; case "13": $timezone = "Asia/Kuala_Lumpur"; break; case "14": $timezone = "Asia/Kuala_Lumpur"; break; case "15": $timezone = "Asia/Kuching"; break; case "16": $timezone = "Asia/Kuching"; break; } break; case "NZ": switch ($region) { case "85": $timezone = "Pacific/Auckland"; break; case "E7": $timezone = "Pacific/Auckland"; break; case "E8": $timezone = "Pacific/Auckland"; break; case "E9": $timezone = "Pacific/Auckland"; break; case "F1": $timezone = "Pacific/Auckland"; break; case "F2": $timezone = "Pacific/Auckland"; break; case "F3": $timezone = "Pacific/Auckland"; break; case "F4": $timezone = "Pacific/Auckland"; break; case "F5": $timezone = "Pacific/Auckland"; break; case "F7": $timezone = "Pacific/Chatham"; break; case "F8": $timezone = "Pacific/Auckland"; break; case "F9": $timezone = "Pacific/Auckland"; break; case "G1": $timezone = "Pacific/Auckland"; break; case "G2": $timezone = "Pacific/Auckland"; break; case "G3": $timezone = "Pacific/Auckland"; break; } break; case "PT": switch ($region) { case "02": $timezone = "Europe/Lisbon"; break; case "03": $timezone = "Europe/Lisbon"; break; case "04": $timezone = "Europe/Lisbon"; break; case "05": $timezone = "Europe/Lisbon"; break; case "06": $timezone = "Europe/Lisbon"; break; case "07": $timezone = "Europe/Lisbon"; break; case "08": $timezone = "Europe/Lisbon"; break; case "09": $timezone = "Europe/Lisbon"; break; case "10": $timezone = "Atlantic/Madeira"; break; case "11": $timezone = "Europe/Lisbon"; break; case "13": $timezone = "Europe/Lisbon"; break; case "14": $timezone = "Europe/Lisbon"; break; case "16": $timezone = "Europe/Lisbon"; break; case "17": $timezone = "Europe/Lisbon"; break; case "18": $timezone = "Europe/Lisbon"; break; case "19": $timezone = "Europe/Lisbon"; break; case "20": $timezone = "Europe/Lisbon"; break; case "21": $timezone = "Europe/Lisbon"; break; case "22": $timezone = "Europe/Lisbon"; break; } break; case "RU": switch ($region) { case "01": $timezone = "Europe/Volgograd"; break; case "02": $timezone = "Asia/Irkutsk"; break; case "03": $timezone = "Asia/Novokuznetsk"; break; case "04": $timezone = "Asia/Novosibirsk"; break; case "05": $timezone = "Asia/Vladivostok"; break; case "06": $timezone = "Europe/Moscow"; break; case "07": $timezone = "Europe/Volgograd"; break; case "08": $timezone = "Europe/Samara"; break; case "09": $timezone = "Europe/Moscow"; break; case "10": $timezone = "Europe/Moscow"; break; case "11": $timezone = "Asia/Irkutsk"; break; case "13": $timezone = "Asia/Yekaterinburg"; break; case "14": $timezone = "Asia/Irkutsk"; break; case "15": $timezone = "Asia/Anadyr"; break; case "16": $timezone = "Europe/Samara"; break; case "17": $timezone = "Europe/Volgograd"; break; case "18": $timezone = "Asia/Krasnoyarsk"; break; case "20": $timezone = "Asia/Irkutsk"; break; case "21": $timezone = "Europe/Moscow"; break; case "22": $timezone = "Europe/Volgograd"; break; case "23": $timezone = "Europe/Kaliningrad"; break; case "24": $timezone = "Europe/Volgograd"; break; case "25": $timezone = "Europe/Moscow"; break; case "26": $timezone = "Asia/Kamchatka"; break; case "27": $timezone = "Europe/Volgograd"; break; case "28": $timezone = "Europe/Moscow"; break; case "29": $timezone = "Asia/Novokuznetsk"; break; case "30": $timezone = "Asia/Vladivostok"; break; case "31": $timezone = "Asia/Krasnoyarsk"; break; case "32": $timezone = "Asia/Omsk"; break; case "33": $timezone = "Asia/Yekaterinburg"; break; case "34": $timezone = "Asia/Yekaterinburg"; break; case "35": $timezone = "Asia/Yekaterinburg"; break; case "36": $timezone = "Asia/Anadyr"; break; case "37": $timezone = "Europe/Moscow"; break; case "38": $timezone = "Europe/Volgograd"; break; case "39": $timezone = "Asia/Krasnoyarsk"; break; case "40": $timezone = "Asia/Yekaterinburg"; break; case "41": $timezone = "Europe/Moscow"; break; case "42": $timezone = "Europe/Moscow"; break; case "43": $timezone = "Europe/Moscow"; break; case "44": $timezone = "Asia/Magadan"; break; case "45": $timezone = "Europe/Samara"; break; case "46": $timezone = "Europe/Samara"; break; case "47": $timezone = "Europe/Moscow"; break; case "48": $timezone = "Europe/Moscow"; break; case "49": $timezone = "Europe/Moscow"; break; case "50": $timezone = "Asia/Yekaterinburg"; break; case "51": $timezone = "Europe/Moscow"; break; case "52": $timezone = "Europe/Moscow"; break; case "53": $timezone = "Asia/Novosibirsk"; break; case "54": $timezone = "Asia/Omsk"; break; case "55": $timezone = "Europe/Samara"; break; case "56": $timezone = "Europe/Moscow"; break; case "57": $timezone = "Europe/Samara"; break; case "58": $timezone = "Asia/Yekaterinburg"; break; case "59": $timezone = "Asia/Vladivostok"; break; case "60": $timezone = "Europe/Kaliningrad"; break; case "61": $timezone = "Europe/Volgograd"; break; case "62": $timezone = "Europe/Moscow"; break; case "63": $timezone = "Asia/Yakutsk"; break; case "64": $timezone = "Asia/Sakhalin"; break; case "65": $timezone = "Europe/Samara"; break; case "66": $timezone = "Europe/Moscow"; break; case "67": $timezone = "Europe/Samara"; break; case "68": $timezone = "Europe/Volgograd"; break; case "69": $timezone = "Europe/Moscow"; break; case "70": $timezone = "Europe/Volgograd"; break; case "71": $timezone = "Asia/Yekaterinburg"; break; case "72": $timezone = "Europe/Moscow"; break; case "73": $timezone = "Europe/Samara"; break; case "74": $timezone = "Asia/Krasnoyarsk"; break; case "75": $timezone = "Asia/Novosibirsk"; break; case "76": $timezone = "Europe/Moscow"; break; case "77": $timezone = "Europe/Moscow"; break; case "78": $timezone = "Asia/Yekaterinburg"; break; case "79": $timezone = "Asia/Irkutsk"; break; case "80": $timezone = "Asia/Yekaterinburg"; break; case "81": $timezone = "Europe/Samara"; break; case "82": $timezone = "Asia/Irkutsk"; break; case "83": $timezone = "Europe/Moscow"; break; case "84": $timezone = "Europe/Volgograd"; break; case "85": $timezone = "Europe/Moscow"; break; case "86": $timezone = "Europe/Moscow"; break; case "87": $timezone = "Asia/Novosibirsk"; break; case "88": $timezone = "Europe/Moscow"; break; case "89": $timezone = "Asia/Vladivostok"; break; } break; case "UA": switch ($region) { case "01": $timezone = "Europe/Kiev"; break; case "02": $timezone = "Europe/Kiev"; break; case "03": $timezone = "Europe/Uzhgorod"; break; case "04": $timezone = "Europe/Zaporozhye"; break; case "05": $timezone = "Europe/Zaporozhye"; break; case "06": $timezone = "Europe/Uzhgorod"; break; case "07": $timezone = "Europe/Zaporozhye"; break; case "08": $timezone = "Europe/Simferopol"; break; case "09": $timezone = "Europe/Kiev"; break; case "10": $timezone = "Europe/Zaporozhye"; break; case "11": $timezone = "Europe/Simferopol"; break; case "13": $timezone = "Europe/Kiev"; break; case "14": $timezone = "Europe/Zaporozhye"; break; case "15": $timezone = "Europe/Uzhgorod"; break; case "16": $timezone = "Europe/Zaporozhye"; break; case "17": $timezone = "Europe/Simferopol"; break; case "18": $timezone = "Europe/Zaporozhye"; break; case "19": $timezone = "Europe/Kiev"; break; case "20": $timezone = "Europe/Simferopol"; break; case "21": $timezone = "Europe/Kiev"; break; case "22": $timezone = "Europe/Uzhgorod"; break; case "23": $timezone = "Europe/Kiev"; break; case "24": $timezone = "Europe/Uzhgorod"; break; case "25": $timezone = "Europe/Uzhgorod"; break; case "26": $timezone = "Europe/Zaporozhye"; break; case "27": $timezone = "Europe/Kiev"; break; } break; case "UZ": switch ($region) { case "01": $timezone = "Asia/Tashkent"; break; case "02": $timezone = "Asia/Samarkand"; break; case "03": $timezone = "Asia/Tashkent"; break; case "06": $timezone = "Asia/Tashkent"; break; case "07": $timezone = "Asia/Samarkand"; break; case "08": $timezone = "Asia/Samarkand"; break; case "09": $timezone = "Asia/Samarkand"; break; case "10": $timezone = "Asia/Samarkand"; break; case "12": $timezone = "Asia/Samarkand"; break; case "13": $timezone = "Asia/Tashkent"; break; case "14": $timezone = "Asia/Tashkent"; break; } break; case "TL": $timezone = "Asia/Dili"; break; case "PF": $timezone = "Pacific/Marquesas"; break; } return $timezone; } function normalizeURI($uri) { $uri=quoted_printable_decode($uri); if (preg_match("/^(.*)/",$uri,$m)) { if (preg_match("/^(.*):/U",$m[2],$p)){ $uri=$m[1]."@".$p[1].">"; } else { $uri=$m[1]."@".$m[2]; } } else if (preg_match("/^(sips?:.*)[=:;]/U",$uri,$p)) { $uri=$p[1]; } return $uri; } function normalizeTime($period) { $sec=$period%60; $min=floor($period/60); $h=floor($min/60); if (!$period) return ; if ($h>0) { $min=$min-60*$h; } if ($h >= 1) { return sprintf('%dh%02d\'%02d"', $h, $min, $sec); } else { return sprintf('%d\'%02d"', $min, $sec); } } function checkURI($uri) { //dprint ("checkURI($uri) "); if ($uri == "") return true; if (preg_match("/^(sip:|sips:)(.*)$/",$uri,$m)) $uri=$m[2]; $regexp = "/^(\+?[a-z0-9*][a-z0-9_.*-]*)@([a-z0-9][a-z0-9-]*\.)+(([a-z]{2,})|(\d+))$/i"; if (stristr($uri,"-.") || !preg_match($regexp, $uri)) { print "Invalid URI \"$uri\". "; return false; } return true; } function checkPhonebookURI($uri) { $regexp = "/^sip:([a-z0-9%_.-]*)@([a-z0-9%.-]*)$/i"; if (stristr($contact,"-.") || !preg_match($regexp, $uri)) { print "Invalid URI \"$uri\". "; return false; } return true; } function getLocalTime($timezone, $timestamp) { $tz = getenv('TZ'); putenv("TZ=$timezone"); if (!$timestamp) { return; } $LocalTime = date("Y-m-d H:i:s", $timestamp); putenv("TZ=$tz"); return $LocalTime; } function getSipThorHomeNode ($account,$sip_proxy) { if (!$account || !$sip_proxy) return false; $socket = fsockopen($sip_proxy, 9500, $errno, $errstr, 1); if (!$socket) { return false; } $request=sprintf("lookup sip_proxy for %s",$account); if (fputs($socket,"$request\r\n") !== false) { $ret = fgets($socket,4096); } fclose($socket); return $ret; } function getSipAccountFromX509Certificate($account='') { if (!$account) { print _('Error, please specify an account'); return false; } list($username, $domain) = explode("@",$account); if (!$username || !$domain) { print _("Invalid account provided"); return false; } if (!$_SERVER[SSL_CLIENT_CERT]) { print _("Error: No X.509 client certificate provided\n"); return false; } if (!$cert=openssl_x509_parse($_SERVER[SSL_CLIENT_CERT])) { print _("Error: Failed to parse X.509 client certificate\n"); return false; } require("/etc/cdrtool/ngnpro_engines.inc"); global $domainFilters, $resellerFilters, $soapEngines; if ($domainFilters[$domain]['sip_engine']) { $credentials['engine'] = $domainFilters[$domain]['sip_engine']; $credentials['customer'] = $domainFilters[$domain]['customer']; $credentials['reseller'] = $domainFilters[$domain]['reseller']; } else if ($domainFilters['default']['sip_engine']) { $credentials['engine']=$domainFilters['default']['sip_engine']; } else { print "Error: no domainFilter available in ngnpro_engines.inc"; return false; } $SOAPlogin=array( "username" => $soapEngines[$credentials['engine']]['username'], "password" => $soapEngines[$credentials['engine']]['password'], "admin" => true ); $SoapAuth = array('auth', $SOAPlogin , 'urn:AGProjects:NGNPro', 0, ''); $SipPort = new WebService_NGNPro_SipPort($soapEngines[$credentials['engine']]['url']); $SipPort->_options['timeout'] = 5; $SipPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $SipPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); $SipPort->addHeader($SoapAuth); // Filter $filter=array('username' => $username, 'domain' => $domain, 'owner' => intval($cert['subject']['CN']) ); // Range $range=array('start' => 0, 'count' => 10 ); $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query=array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Call function $result = $SipPort->getAccounts($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error from %s (SipPort): %s (%s): %s",$soapEngines[$credentials['engine']]['url'],$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } if ($result->total != 1) { return false; } $credentials['account'] = $account; $credentials['customer'] = $result->customer; $credentials['reseller'] = $result->reseller; return $credentials; } function getSipAccountFromHTTPDigest () { require("/etc/cdrtool/enrollment/config.ini"); if (!is_array($enrollment) || !strlen($enrollment['nonce_key'])) { $log= 'Error: Missing nonce in enrollment settings'; syslog(LOG_NOTICE, $log); die($log); return false; } if ($_REQUEST['realm']) { // required by Blink cocoa $realm=$_REQUEST['realm']; $a=explode("@",$realm); if (count($a) == 2) { $realm = $a[1]; } } else { $realm = 'SIP_settings'; } // security implemented based on // http://static.springsource.org/spring-security/site/docs/2.0.x/reference/digest.html $_id = microtime(true)+ 300; // expires 5 minutes in the future $_key = $enrollment['nonce_key']; $nonce = base64_encode($_id.":".md5($_id.":".$_key)); if (empty($_SERVER['PHP_AUTH_DIGEST'])) { header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"'); //syslog(LOG_NOTICE, sprintf ("SIP settings page: sent auth request for realm %s to %s", $realm, $_SERVER['REMOTE_ADDR'])); die(); } // analyze the PHP_AUTH_DIGEST variable if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) || !isset($data['username'])) { $log=sprintf("SIP settings page: Invalid credentials from %s", $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die($log); } // generate the valid response $username = $data['username']; if (strstr($username, '@')) { $a = explode("@",$username); $username = $a[0]; $domain = $a[1]; } else { $domain = $realm; } require("/etc/cdrtool/ngnpro_engines.inc"); global $domainFilters, $resellerFilters, $soapEngines ; $credentials['account'] = sprintf("%s@%s",$username, $domain); if ($domainFilters[$domain]['sip_engine']) { $credentials['engine'] = $domainFilters[$domain]['sip_engine']; $credentials['customer'] = $domainFilters[$domain]['customer']; $credentials['reseller'] = $domainFilters[$domain]['reseller']; } else if ($domainFilters['default']['sip_engine']) { $credentials['engine']=$domainFilters['default']['sip_engine']; } else { $log=sprintf("SIP settings page error: no domainFilter available in ngnpro_engines.inc from %s", $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die(); } $SOAPlogin=array( "username" => $soapEngines[$credentials['engine']]['username'], "password" => $soapEngines[$credentials['engine']]['password'], "admin" => true ); $SoapAuth = array('auth', $SOAPlogin , 'urn:AGProjects:NGNPro', 0, ''); $SipPort = new WebService_NGNPro_SipPort($soapEngines[$credentials['engine']]['url']); $SipPort->_options['timeout'] = 5; $SipPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $SipPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); $SipPort->addHeader($SoapAuth); $result = $SipPort->getAccount(array("username" =>$username,"domain" =>$domain)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"'); $log=sprintf("SIP settings page error: non-existent username %s from %s", $credentials['account'], $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die(); } $web_password=''; foreach ($result->properties as $_property) { if ($_property->name == 'web_password') { //$web_password = explode(":", $_property->value, -1); $split=explode(":",$_property->value); $web_password=$split['0']; break; } } if (!empty($web_password)) { //$A1 = md5($data['username'] . ':' . $realm . ':' . $data['password']); $A1 = $web_password; $login_type_log = 'web password'; //$log=sprintf("TEST %s %s %s %s", $data['username'], $realm, $web_password , $data['nonce']); //syslog(LOG_NOTICE, $log); // } else if (strstr($data['username'], '@')) { // $A1 = md5($data['username'] . ':' . $realm . ':' . $result->password); // $login_type_log = 'cleartext legacy password'; } else if ($result->ha1) { $login_type_log = sprintf('encrypted password'); $A1 = $result->ha1; } else { $A1 = md5($data['username'] . ':' . $realm . ':' . $result->password); $login_type_log = 'cleartext password'; } $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']); $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2); if ($data['response'] != $valid_response ) { header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"'); $log=sprintf("SIP settings page error: wrong credentials using %s for %s from %s", $login_type_log, $credentials['account'], $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die(); } // check nonce $client_nonce_els=explode(":",base64_decode($data['nonce'])); if (md5($client_nonce_els[0].":".$_key) != $client_nonce_els[1]) { header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"'); $log=sprintf("SIP settings page error: wrong nonce for %s from %s", $credentials['account'], $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die(); } if (microtime(true) > $client_nonce_els[0]) { // nonce is stale header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.$nonce.'",stale=true,opaque="'.md5($realm).'"'); $log=sprintf("SIP settings page error: nonce has expired for %s from %s", $username, $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); die(); } $log=sprintf("SIP settings page: %s logged in using %s from %s", $credentials['account'], $login_type_log, $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); $credentials['customer'] = $result->customer; $credentials['reseller'] = $result->reseller; return $credentials; } function http_digest_parse($txt) { // function to parse the http auth header // protect against missing data $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); $data = array(); $keys = implode('|', array_keys($needed_parts)); preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER); foreach ($matches as $m) { $data[$m[1]] = $m[3] ? $m[3] : $m[4]; unset($needed_parts[$m[1]]); } return $needed_parts ? false : $data; } function renderUI($SipSettings_class,$account,$login_credentials,$soapEngines) { // Generic code for all sip settings pages $SipSettings = new $SipSettings_class($account,$login_credentials,$soapEngines); if ($_REQUEST['action']) { $log_action=$_REQUEST['action']; } else { $log_action='load main page'; } $log=sprintf("SIP settings page: %s for %s from %s", $log_action, $account, $_SERVER['REMOTE_ADDR']); syslog(LOG_NOTICE, $log); if (!strstr($_REQUEST['action'],'get_') && !strstr($_REQUEST['action'],'set_') && !strstr($_REQUEST['action'],'put_') && !strstr($_REQUEST['action'],'delete_') && !strstr($_REQUEST['action'],'export_') && !strstr($_REQUEST['action'],'add_')) { $title = "$account"; if (array_key_exists($SipSettings->tab, $SipSettings->tabs)) { $title = $SipSettings->tabs[$SipSettings->tab]. " - ". $title; } $header = $SipSettings->headerFile; $css = $SipSettings->cssFile; $auto_refesh_tab=$SipSettings->auto_refesh_tab; $absolute_url= $SipSettings->absolute_url; include($header); dprint("Header file $header included, refresh=$auto_refesh_tab"); include($css); dprint("CSS file $css included"); } if ($_REQUEST['action']=="save settings") { if ($SipSettings->checkSettings()) { $SipSettings->saveSettings(); unset($SipSettings); $SipSettings = new $SipSettings_class($account,$login_credentials,$soapEngines); } else { print ""; printf (_("Error: %s"),$SipSettings->error); print ""; } } else if ($_REQUEST['action']=="set diversions") { $SipSettings->setDiversions(); unset($SipSettings); $SipSettings = new $SipSettings_class($account,$login_credentials,$soapEngines); } else if ($_REQUEST['action']=="set barring") { $SipSettings->setBarringPrefixes(); } else if ($_REQUEST['action']=="set reject") { $SipSettings->setRejectMembers(); } else if ($_REQUEST['action']=="set accept rules") { $SipSettings->setAcceptRules(); } else if ($_REQUEST['action']=="set aliases") { $SipSettings->setAliases(); } else if ($_REQUEST['action']=="send email") { $SipSettings->sendEmail(); } else if ($_REQUEST['action']=="delete account") { $SipSettings->deleteAccount(); } else if ($_REQUEST['action']=="delete_account") { // print "

    ";
            // print_r($SipSettings->Preferences);
             $date1= new datetime($SipSettings->Preferences['account_delete_request']);
             $today= new datetime('now');
             if ($date1->diff($today)->d <= '2' && $SipSettings->Preferences['account_delete_request'] ) {
     
                 $SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
                 $result = $SipSettings->SipPort->deleteAccount($SipSettings->sipId);
     
                 if ((new PEAR)->isError($result)) {
                     $error_msg  = $result->getMessage();
                     $error_fault= $result->getFault();
                     $error_code = $result->getCode();
                     $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
                     $return=array('success'       => false,
                                 'error_message' => $_msg
                                 );
                     return false;
                 }  else {
                     printf("

    The account %s has been removed

    ",$SipSettings->account); $SipSettings->sendRemoveAccount(); //print "" print ""; print _("Click here to Logout"); print ""; //$auth->logout(); //$sess->delete(); return true; } } else { printf("The delete request for account %s has expired or is not valid",$SipSettings->account); return false; } return true ; //$SipSettings->deleteAccount(); } else if ($_REQUEST['action']=="get_crt") { $SipSettings->exportCertificateX509(); return true; } else if ($_REQUEST['action']=="get_p12") { $SipSettings->exportCertificateP12(); return true; } else if ($_REQUEST['action'] == 'get_balance_history') { $SipSettings->getBalanceHistory(); if ($_REQUEST['csv']) { $SipSettings->exportBalanceHistory(); } else { print json_encode($SipSettings->balance_history); } return true; } else if ($_REQUEST['action'] == 'get_call_forwarding') { $SipSettings->getDiversions(); print json_encode($SipSettings->diversions); return true; } else if ($_REQUEST['action'] == 'get_prepaid') { $SipSettings->getPrepaidStatus(); print json_encode($SipSettings->prepaidAccount); return true; } else if ($_REQUEST['action'] == 'get_monthly_usage') { $SipSettings->getCallStatistics(); print json_encode($SipSettings->thisMonth); return true; } else if ($_REQUEST['action'] == 'get_accept_rules'){ $SipSettings->getAcceptRules(); print json_encode($SipSettings->acceptRules); return true; } else if ($_REQUEST['action'] == 'get_journal_entries'){ $SipSettings->getJournalEntries(); print json_encode($SipSettings->journalEntries); return true; } else if ($_REQUEST['action'] == 'put_journal_entries'){ print json_encode($SipSettings->putJournalEntries()); return true; } else if ($_REQUEST['action'] == 'delete_journal_entries'){ print json_encode($SipSettings->deleteJournalEntries()); return true; } else if ($_REQUEST['action'] == 'get_reject_rules'){ $SipSettings->getRejectMembers(); print json_encode($SipSettings->rejectMembers); return true; } else if ($_REQUEST['action'] == 'get_history'){ $SipSettings->getHistory('completed'); print json_encode($SipSettings->call_history); return true; } else if ($_REQUEST['action'] == 'get_voicemail'){ $SipSettings->getVoicemail(); print json_encode($SipSettings->voicemail); return true; } else if ($_REQUEST['action'] == 'get_aliases'){ $SipSettings->getAliases(); print json_encode($SipSettings->aliases); return true; } else if ($_REQUEST['action'] == 'get_enum'){ $SipSettings->getEnumMappings(); print json_encode($SipSettings->enums); return true; } else if ($_REQUEST['action'] == 'export_identity_proof'){ $SipSettings->exportIdentityProof(); return true; } else if ($_REQUEST['action'] == 'add_balance'){ if (!$_REQUEST['id'] || !$_REQUEST['number']) { $return=array('success' => false, 'error_message' => 'Missing id or number' ); print (json_encode($return)); return false; } $card = array('id' => intval($_REQUEST['id']), 'number' => $_REQUEST['number'] ); $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->addBalanceFromVoucher($SipSettings->sipId,$card); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $return=array('success' => false, 'error_message' => $_msg ); print (json_encode($return)); return false; } else { $return=array('success' => true, 'error_message' => 'Added balance succeeded' ); print (json_encode($return)); return true; } } else if ($_REQUEST['action'] == 'get_identity'){ $account=array('sip_address' => $SipSettings->account, 'email' => $SipSettings->email, 'first' => $SipSettings->firstName, 'lastname' => $SipSettings->lastName, 'pstn_caller_id' => $SipSettings->rpid, 'mobile_number' => $SipSettings->mobile_number, 'timezone' => $SipSettings->timezone, 'no_answer_timeout' => $SipSettings->timeout, 'quick_dial' => $SipSettings->quickdial ); print json_encode($account); return true; } else if ($_REQUEST['action'] == 'get_devices'){ $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->getSipDeviceLocations(array($SipSettings->sipId)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return false; } else { foreach ($result[0]->locations as $locationStructure) { $contact=$locationStructure->address.":".$locationStructure->port; if ($locationStructure->publicAddress) { $publicContact=$locationStructure->publicAddress.":".$locationStructure->publicPort; } else { $publicContact=$contact; } $devices[]=array("contact" => $contact, "publicContact" => $publicContact, "expires" => $locationStructure->expires, "user_agent" => $locationStructure->userAgent, "transport" => $locationStructure->transport ); } } print (json_encode($devices)); return true; } else if ($_REQUEST['action'] == 'set_dnd_on'){ $SipSettings->getAcceptRules(); $SipSettings->acceptRules['temporary']=array('groups' =>array('nobody'), 'duration' =>intval($_REQUEST['duration']) ); $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->setAcceptRules($SipSettings->sipId,$SipSettings->acceptRules); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } else { $_ret=true; if (intval($_REQUEST['duration'] > 0)) { $_msg=sprintf(_('Do not disturb has been enabled for %d minutes'),intval($_REQUEST['duration'])); } else { $_msg=sprintf(_('Do not disturb has been enabled')); } } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else if ($_REQUEST['action'] == 'set_dnd_off'){ $SipSettings->getAcceptRules(); $SipSettings->acceptRules['temporary']=array('groups' =>array('everybody'), 'duration' =>0 ); $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->setAcceptRules($SipSettings->sipId,$SipSettings->acceptRules); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } else { $_ret=true; $_msg=sprintf(_('Do not disturb has been disabled')); } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else if ($_REQUEST['action'] == 'set_privacy_on'){ $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->addToGroup(array("username" => $SipSettings->username,"domain"=> $SipSettings->domain),"anonymous"); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } else { $_ret=true; $_msg=sprintf(_('Caller-ID is now hidden for outgoing calls')); } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else if ($_REQUEST['action'] == 'set_privacy_off'){ $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->removeFromGroup(array("username" => $SipSettings->username,"domain"=> $SipSettings->domain),"anonymous"); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 1031) { $_ret=true; $_msg=sprintf(_('Caller-ID is now visible for outgoing calls')); } else { $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } } else { $_ret=true; $_msg=sprintf(_('Caller-ID is now visible for outgoing calls')); } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else if ($_REQUEST['action'] == 'add_alias'){ $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $username=trim($_REQUEST['username']); if (!strlen($username)) { $return=array('success' => false, 'error_message' => 'Error: missing username' ); print (json_encode($return)); return false; } $_aliasObject=array("id"=>array("username"=>strtolower($username), "domain"=>$SipSettings->domain ), "owner" => intval($SipSettings->owner), "target"=> array("username" => $SipSettings->username,"domain"=> $SipSettings->domain) ) ; $result = $SipSettings->SipPort->addAlias($_aliasObject); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } else { $_ret=true; $_msg=sprintf(_('Added alias %s'),strtolower($username)); } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else if ($_REQUEST['action'] == 'set_call_forwarding') { $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->getCallDiversions($SipSettings->sipId); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } $SipSettings->getVoicemail(); foreach(array_keys($SipSettings->diversionType) as $condition) { $old_diversions[$condition]=$result->$condition; } $_log=''; foreach(array_keys($old_diversions) as $key) { if (isset($_REQUEST[$key])) { printf ("Key $key changed %s",$_REQUEST[$key]); $textboxURI=$_REQUEST[$key]; if ($textboxURI == "" && strlen($SipSettings->mobile_number)) { $textboxURI = $SipSettings->mobile_number; } if ($textboxURI && $textboxURI != "" && !preg_match("/@/",$textboxURI)) { $textboxURI=$textboxURI."@".$SipSettings->domain; } if (preg_match("/^([\+|0].*)@/",$textboxURI,$m)) { $textboxURI=$m[1]."@".$SipSettings->domain; } if (strlen($textboxURI) && $textboxURI != "" && !preg_match("/^sip:/",$textboxURI)) { $textboxURI='sip:'.$textboxURI; } if ($textboxURI) { $new_diversions[$key]=$textboxURI; } $_log.=sprintf("%s=%s ",$key,$textboxURI); $divert_changed=true; } else { if ($old_diversions[$key]) { $new_diversions[$key]=$old_diversions[$key]; } } } if ($divert_changed) { $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->setCallDiversions($SipSettings->sipId,$new_diversions); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); $_ret=false; } else { $_ret=true; $_msg=sprintf(_('Changed diversions %s'),$_log); } $return=array('success' => $_ret, 'error_message' => $_msg ); print (json_encode($return)); return true; } else { $return=array('success' => true, 'error_message' => 'Diversions remained the same' ); print (json_encode($return)); return true; } } else if ($_REQUEST['action']) { $return=array('success' => false, 'error_message' => "Error: invalid action" ); print (json_encode($return)); return false; } if (!$_REQUEST['export']) { $SipSettings->showAccount(); print " "; } } class Enrollment { var $init = false; var $create_voicemail = false; var $send_email_notification = true; var $create_email_alias = false; var $create_customer = true; var $timezones = array(); var $default_timezone = 'Europe/Amsterdam'; var $configuration_file = '/etc/cdrtool/enrollment/config.ini'; var $allow_pstn = 1; var $quota = 50; var $prepaid = 1; var $create_certificate = 0; var $customer_belongs_to_reseller = false; function log_action($action){ global $auth; $location = "Unknown"; $_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR']); if ($_loc['country_name']) { $location = $_loc['country_name']; } $log = sprintf("CDRTool login username=%s, IP=%s, location=%s, action=%s, script=%s", $auth->auth["uname"], $_SERVER['REMOTE_ADDR'], $location, $action, $_SERVER['PHP_SELF'] ); syslog(LOG_NOTICE, $log); } function Enrollment() { require($this->configuration_file); require("/etc/cdrtool/ngnpro_engines.inc"); $this->soapEngines = $soapEngines; $this->enrollment = $enrollment; $this->loadTimezones(); if (!is_array($this->soapEngines)) { $return=array('success' => false, 'error_message' => 'Error: Missing soap engines configuration' ); print (json_encode($return)); return false; } if (!is_array($this->enrollment)) { $return=array('success' => false, 'error_message' => 'Error: Missing enrollment configuration' ); print (json_encode($return)); return false; } $this->sipDomain = $this->enrollment['sip_domain']; $this->sipEngine = $this->enrollment['sip_engine']; if ($this->enrollment['timezone']) { $this->default_timezone = $this->enrollment['timezone']; } if ($this->enrollment['customer_engine']) { $this->customerEngine = $this->enrollment['customer_engine']; } else { $this->customerEngine = $this->enrollment['sip_engine']; } if ($this->enrollment['email_engine']) { $this->emailEngine = $this->enrollment['email_engine']; } else { $this->emailEngine = $this->enrollment['sip_engine']; } if (is_array($this->enrollment['groups'])) { $this->groups = $this->enrollment['groups']; } else { $this->groups = array(); } $this->reseller = $this->enrollment['reseller']; $this->outbound_proxy = $this->enrollment['outbound_proxy']; $this->xcap_root = $this->enrollment['xcap_root']; $this->msrp_relay = $this->enrollment['msrp_relay']; $this->settings_url = $this->enrollment['settings_url']; $this->ldap_hostname = $this->enrollment['ldap_hostname']; $this->ldap_dn = $this->enrollment['ldap_dn']; $this->conference_server = $this->enrollment['conference_server']; if ($this->enrollment['sip_class']) { $this->sipClass = $this->enrollment['sip_class']; } else { $this->sipClass = 'SipSettings'; } if (!$this->sipEngine) { $return=array('success' => false, 'error_message' => 'Missing sip engine' ); print (json_encode($return)); return false; } if (!$this->sipDomain) { $return=array('success' => false, 'error_message' => 'Missing sip domain' ); print (json_encode($return)); return false; } $this->sipLoginCredentials = array( 'reseller' => intval($this->reseller), 'sip_engine' => $this->sipEngine, 'login_type' => 'admin' ); $this->init=true; } function createAccount() { if (!$this->init) return false; if (!$_REQUEST['email']) { $return=array('success' => false, 'error' => 'value_error', 'error_message' => 'Missing email address' ); print (json_encode($return)); return false; } if (!$this->checkEmail($_REQUEST['email'])) { $return=array('success' => false, 'error' => 'value_error', 'error_message' => 'Invalid email address' ); print (json_encode($return)); return false; } if (!$_REQUEST['password']) { $return=array('success' => false, 'error' => 'value_error', 'error_message' => 'Missing password' ); print (json_encode($return)); return false; } if (!$_REQUEST['display_name']) { $return=array('success' => false, 'error' => 'value_error', 'error_message' => 'Missing display name' ); print (json_encode($return)); return false; } $username=strtolower(trim($_REQUEST['username'])); if (!preg_match("/^[1-9a-z][0-9a-z_.-]{2,64}[0-9a-z]$/",$username)) { $return=array('success' => false, 'error' => 'value_error', 'error_message' => 'The username must contain at least 4 lowercase alpha-numeric . _ or - characters and must start and end with a positive digit or letter' ); print (json_encode($return)); return false; } $sip_address=$username.'@'.$this->sipDomain; if ($this->create_customer && !$_REQUEST['owner']) { // create owner id $customerEngine = 'customers@'.$this->customerEngine; $this->CustomerSoapEngine = new SoapEngine($customerEngine,$this->soapEngines,$this->customerLoginCredentials); $_customer_class = $this->CustomerSoapEngine->records_class; $this->customerRecords = new $_customer_class($this->CustomerSoapEngine); $this->customerRecords->html=false; $properties=$this->customerRecords->setInitialCredits(array('sip_credit' => 1, 'sip_alias_credit' => 1, 'email_credit' => 1 ) ); if (preg_match("/^(\w+)\s+(\w+)$/",$_REQUEST['display_name'],$m)) { $firstName = $m[1]; $lastName = $m[2]; } else { $firstName = $_REQUEST['display_name']; $lastName = 'Blink'; } $this->log_action("Create owner account ($firstname $lastname) "); $timezone=$_REQUEST['tzinfo']; if (!in_array($timezone, $this->timezones)) { $timezone=$this->default_timezone; } $location = lookupGeoLocation($_SERVER['REMOTE_ADDR']); $customer=array( 'firstName' => $firstName, 'lastName' => $lastName, 'timezone' => $timezone, 'password' => trim($_REQUEST['password']), 'email' => trim($_REQUEST['email']), 'country' => $location['country_code'], 'state' => utf8_encode($location['region']), 'city' => utf8_encode($location['city']), 'properties' => $properties ); if ($this->customer_belongs_to_reseller) { $customer['reseller'] =intval($this->reseller); } if ($location['country_code'] == 'NL') { $customer['tel'] = '+31999999999'; } else if ($location['country_code'] == 'US') { $customer['tel'] = sprintf ("+1%s9999999",$location['area_code']); } else { $customer['tel'] = '+19999999999'; } $_customer_created=false; $j=0; while ($j < 3) { $username.=RandomString(4); $customer['username']=$username; if (!$result = $this->customerRecords->addRecord($customer)) { if ($this->customerRecords->SoapEngine->exception->errorcode != "5001") { $return=array('success' => false, 'error' => 'internal_error', 'error_message' => 'failed to create non-duplicate customer entry' ); print (json_encode($return)); return false; } } else { $_customer_created=true; break; } $j++; } if (!$_customer_created) { if ($this->sipRecords->soap_error_description) { $_msg=$this->sipRecords->soap_error_description; } else { $_msg='failed to create customer account'; } $return=array('success' => false, 'error' => 'internal_error', 'error_message' => $_msg ); print (json_encode($return)); return false; } else { $this->log_action("Owner account created (". $customer['username'].")"); } $owner=$result->id; if (!$owner) { $return=array('success' => false, 'error' => 'internal_error', 'error_message' => 'failed to obtain a new owner id' ); print (json_encode($return)); return false; } else { $this->log_action("Owner id is $owner (". $customer['username'].")"); } } else if (is_numeric($_REQUEST['owner']) && $_REQUEST['owner'] != 0 ) { $owner=intval($_REQUEST['owner']); } else { $return=array('success' => false, 'error' => 'internal_error', 'error_message' => 'no owner information provided' ); print (json_encode($return)); return false; } // create SIP Account $sipEngine = 'sip_accounts@'.$this->sipEngine; $this->SipSoapEngine = new SoapEngine($sipEngine,$this->soapEngines,$this->sipLoginCredentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $this->sipRecords->html=false; $sip_properties[]=array('name'=> 'ip', 'value' => $_SERVER['REMOTE_ADDR']); $sip_properties[]=array('name'=> 'registration_email', 'value' => $_REQUEST['email']); $languages=array("en","ro","nl","es","de"); if (isset($_REQUEST['lang'])){ if (in_array($_REQUEST['lang'],$languages)) { $sip_properties[]=array('name'=> 'language', 'value' => $_REQUEST['lang']); } } if (strlen($timezone)) { $sip_properties[]=array('name'=> 'timezone', 'value' => $timezone); } if (strlen($user_agent)) { $sip_properties[]=array('name'=> 'user_agent', 'value' => trim(urldecode($user_agent))); } $sipAccount = array('account' => $sip_address, 'fullname' => $_REQUEST['display_name'], 'email' => $_REQUEST['email'], 'password' => $_REQUEST['password'], 'timezone' => $timezone, 'prepaid' => $this->prepaid, 'pstn' => $this->allow_pstn, 'quota' => $this->quota, 'owner' => intval($owner), 'groups' => $this->groups, 'properties'=> $sip_properties ); $this->log_action("Create SIP account ($sip_addres)"); if (!$result = $this->sipRecords->addRecord($sipAccount)) { if ($this->sipRecords->SoapEngine->exception->errorstring) { if ($this->sipRecords->SoapEngine->exception->errorcode == 1011) { $return=array('success' => false, 'error' => 'user_exists', 'error_message' => $this->sipRecords->SoapEngine->exception->errorstring ); } else { $return=array('success' => false, 'error' => 'internal_error', 'error_message' => $this->sipRecords->SoapEngine->exception->errorstring ); } } else { $_msg='failed to create sip account'; $return=array('success' => false, 'error' => 'internal_error', 'error_message' => $_msg ); } print (json_encode($return)); $_dictionary=array('customer'=>intval($owner), 'error' => 'internal_error', 'confirm' => true ); $this->customerRecords->deleteRecord($_dictionary); return false; } else { $sip_address=$result->id->username.'@'.$result->id->domain; $this->log_action("SIP account created ($sip_address)"); if ($this->create_certificate) { if (!$passport = $this->generateCertificate($sip_address,$_REQUEST['email'],$_REQUEST['password'])) { $return=array('success' => false, 'error' => 'internal_error', 'error_message' => 'failed to generate certificate' ); print (json_encode($return)); return false; } } // Generic code for all sip settings pages if ($this->create_voicemail || $this->send_email_notification) { if ($SipSettings = new $this->sipClass($sip_address,$this->sipLoginCredentials,$this->soapEngines)) { if ($this->create_voicemail) { // Add voicemail account $this->log_action("Add voicemail account ($sip_address)"); $SipSettings->addVoicemail(); $SipSettings->setVoicemailDiversions(); } if ($this->send_email_notification) { // Sent account settings by email $SipSettings->sendEmail('hideHtml'); } } } if ($this->create_email_alias) { $this->log_action("Add email alias ($sip_address)"); $emailEngine = 'email_aliases@'.$this->emailEngine; $this->EmailSoapEngine = new SoapEngine($emailEngine,$this->soapEngines,$this->sipLoginCredentials); $_email_class = $this->EmailSoapEngine->records_class; $this->emailRecords = new $_email_class($this->EmailSoapEngine); $this->emailRecords->html=false; $emailAlias = array('name' => strtolower($sip_address), 'type' => 'MBOXFW', 'owner' => intval($owner), 'value' => $_REQUEST['email'] ); $this->emailRecords->addRecord($emailAlias); } $return=array('success' => true, 'sip_address' => $sip_address, 'email' => $result->email, 'settings_url' => $this->settings_url, 'outbound_proxy' => $this->outbound_proxy ); if ($this->create_certificate) { $return['passport'] = $passport; } if ($this->ldap_hostname) { $return['ldap_hostname'] = $this->ldap_hostname; } if ($this->ldap_dn) { $return['ldap_dn'] = $this->ldap_dn; } if ($this->msrp_relay) { $return['msrp_relay'] = $this->msrp_relay; } if ($this->xcap_root) { $return['xcap_root'] = $this->xcap_root; } if ($this->conference_server) { $return['conference_server'] = $this->conference_server; } print (json_encode($return)); return true; } } function generateCertificate($sip_address,$email,$password) { if (!$this->init) return false; if (!is_array($this->enrollment)) { print _("Error: missing enrollment settings"); return false; } if (!$this->enrollment['ca_conf']) { //print _("Error: missing enrollment ca_conf settings"); return false; } if (!$this->enrollment['ca_crt']) { //print _("Error: missing enrollment ca_crt settings"); return false; } if (!$this->enrollment['ca_key']) { //print _("Error: missing enrollment ca_key settings"); return false; } $config = array( 'config' => $this->enrollment['ca_conf'], 'digest_alg' => 'md5', 'private_key_bits' => 1024, 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'encrypt_key' => false, ); $dn = array( "countryName" => $this->enrollment['countryName'], "stateOrProvinceName" => $this->enrollment['stateOrProvinceName'], "localityName" => $this->enrollment['localityName'], "organizationName" => $this->enrollment['organizationName'], "organizationalUnitName" => $this->enrollment['organizationalUnitName'], "commonName" => $sip_address, "emailAddress" => $email ); $this->key = openssl_pkey_new($config); $this->csr = openssl_csr_new($dn, $this->key); openssl_csr_export($this->csr, $this->csr_out); openssl_pkey_export($this->key, $this->key_out, $password, $config); $ca="file://".$this->enrollment['ca_crt']; $this->crt = openssl_csr_sign($this->csr, $ca, $this->enrollment['ca_key'], 3650, $config); if ($this->crt==FALSE) { while (($e = openssl_error_string()) !== false) { echo $e . "\n"; print "

    "; } return false; } openssl_x509_export ($this->crt, $this->crt_out); openssl_pkcs12_export ($this->crt, $this->pk12_out, $this->key, $password); return array( 'crt' => $this->crt_out, 'key' => $this->key_out, 'pk12' => $this->pk12_out, 'ca' => file_get_contents($this->enrollment['ca_crt']) ); } function checkEmail($email) { dprint ("checkEmail($email)"); $regexp = "/^([a-z0-9][a-z0-9_.-]*)@([a-z0-9][a-z0-9-]*\.)+([a-z]{2,})$/i"; if (stristr($email,"-.") || !preg_match($regexp, $email)) { return false; } return true; } function loadTimezones () { if (!$fp = fopen("timezones", "r")) { syslog(LOG_NOTICE, 'Error: Failed to open timezones file'); return false; } while ($buffer = fgets($fp,1024)) { $this->timezones[]=trim($buffer); } fclose($fp); } } class PaypalProcessor { var $deny_countries = array(); var $allow_countries = array(); var $deny_ips = array(); var $make_credit_checks = true; var $transaction_results = array('success' => false); var $vat = 0; function PaypalProcessor($account) { require('cc_processor.php'); $this->CardProcessor = new CreditCardProcessor(); $this->account = &$account; } function refundTransaction($transaction_id) { } function doDirectPayment($basket) { if (!is_object($this->account)) { print " "; print 'Invalid account data'; print " "; return false; } if (!is_array($basket)) { print " "; print 'Invalid basket data'; print " "; return false; } if (is_array($this->test_credit_cards) && in_array($_POST['creditCardNumber'], $this->test_credit_cards)) { $this->CardProcessor->environment='sandbox'; } $this->CardProcessor->chapter_class = 'chapter'; $this->CardProcessor->odd_row_class = 'oddc'; $this->CardProcessor->even_row_class = 'evenc'; $this->CardProcessor->note = $this->account->account; $this->CardProcessor->account = $this->account->account; $this->CardProcessor->vat = $this->vat; // set hidden elements we need to preserve in the shopping cart application $this->CardProcessor->hidden_elements = $this->account->hiddenElements; // load shopping items $this->CardProcessor->cart_items=$basket; // load user information from owner information if available otherwise from sip account settings if ($this->account->owner_information['firstName']) { $this->CardProcessor->user_account['FirstName']=$this->account->owner_information['firstName']; } else { $this->CardProcessor->user_account['FirstName']=$this->account->firstName; } if ($this->account->owner_information['lastName']) { $this->CardProcessor->user_account['LastName']=$this->account->owner_information['lastName']; } else { $this->CardProcessor->user_account['LastName']=$this->account->lastName; } if ($this->account->owner_information['email']) { $this->CardProcessor->user_account['Email']=$this->account->owner_information['email']; } else { $this->CardProcessor->user_account['Email']=$this->account->email; } if ($this->account->owner_information['address'] && $this->account->owner_information['address']!= 'Unknown') { $this->CardProcessor->user_account['Address1']=$this->account->owner_information['address']; } else { $this->CardProcessor->user_account['Address1']=''; } if ($this->account->owner_information['city'] && $this->account->owner_information['city']!= 'Unknown') { $this->CardProcessor->user_account['City']=$this->account->owner_information['city']; } else { $this->CardProcessor->user_account['City']=''; } if ($this->account->owner_information['country'] && $this->account->owner_information['country']!= 'Unknown') { $this->CardProcessor->user_account['Country']=$this->account->owner_information['country']; } else { $this->CardProcessor->user_account['Country']=''; } if ($this->account->owner_information['state'] && $this->account->owner_information['state']!= 'Unknown') { $this->CardProcessor->user_account['State']=$this->account->owner_information['state']; } else { $this->CardProcessor->user_account['State']=''; } if ($this->account->owner_information['postcode'] && $this->account->owner_information['postcode']!= 'Unknown') { $this->CardProcessor->user_account['PostCode']=$this->account->owner_information['postcode']; } else { $this->CardProcessor->user_account['PostCode']=''; } if ($_REQUEST['purchase'] == '1' ) { $chapter=sprintf(_("Transaction Results")); $this->account->showChapter($chapter); print " "; // ensure that submit requests are coming only from the current page if ($_SERVER['HTTP_REFERER'] == $this->CardProcessor->getPageURL()) { // check submitted values $errors = $this->CardProcessor->checkForm($_POST); if (count($errors) > 0){ print $this->CardProcessor->displayFormErrors($errors); foreach (array_keys($errors) as $key) { $log_text.=sprintf("%s:%s ",$errors[$key]['field'],$errors[$key]['desc']); } $log=sprintf("CC transaction for %s failed with error: %s",$this->account->account,$log_text); syslog(LOG_NOTICE, $log); return false; } // process the payment $b=time(); $pay_process_results = $this->CardProcessor->processPayment($_POST); if(count($pay_process_results['error']) > 0){ // there was a problem with payment // show error and stop if ($pay_process_results['error']['field'] == 'reload') { print $pay_process_results['error']['desc']; } else { print $this->CardProcessor->displayProcessErrors($pay_process_results['error']); } $e=time(); $d=$e-$b; $log=sprintf("CC transaction for %s failed with error: %s (%s) after %d seconds", $this->account->account, $pay_process_results['error']['short_message'], $pay_process_results['error']['error_code'], $d ); syslog(LOG_NOTICE, $log); return false; } else { $e=time(); $d=$e-$b; $log=sprintf("CC transaction %s for %s completed succesfully in %d seconds", $pay_process_results['success']['desc']->TransactionID, $this->account->account, $d ); syslog(LOG_NOTICE, $log); print "

    "; print _("Transaction completed sucessfully. "); /* if ($this->CardProcessor->environment!='sandbox' && $this->account->first_transaction) { print "

    "; print _("This is your first payment. "); print "

    "; print _("Please allow the time to check the validity of your transaction before activating your Credit. "); print "

    "; print _("You can speed up the validation process by sending a copy of an utility bill (electriciy, gas or TV) that displays your address. "); print "

    "; printf (_("For questions related to your payments or to request a refund please email to %s and mention your transaction id %s. "), $this->account->billing_email, $pay_process_results['success']['desc']->TransactionID ); $this->make_credit_checks=true; } else { print "

    "; print _("You may check your new balance in the Credit tab. "); } */ } if ($this->account->Preferences['ip'] && $_loc=geoip_record_by_name($this->account->Preferences['ip'])) { $enrollment_location=$_loc['country_name'].'/'.$_loc['city']; } else if ($this->account->Preferences['ip'] && $_loc=geoip_country_name_by_name($this->account->Preferences['ip'])) { $enrollment_location=$_loc; } else { $enrollment_location='Unknown'; } if ($_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR'])) { $transaction_location=$_loc['country_name'].'/'.$_loc['city']; } else if ($_loc=geoip_country_name_by_name($_SERVER['REMOTE_ADDR'])) { $transaction_location=$_loc; } else { $transaction_location='Unknown'; } if ($this->account->Preferences['timezone']) { $timezone=$this->account->Preferences['timezone']; } else { $timezone='Unknown'; } $extra_information=array( 'Account Page' => $this->account->admin_url_absolute, 'Account First Name' => $this->account->firstName, 'Account Last Name ' => $this->account->lastName, 'Account Timezone' => $this->account->timezone, 'Enrollment IP' => $this->account->Preferences['ip'], 'Enrollment Location' => $enrollment_location, 'Enrollment Email' => $this->account->Preferences['registration_email'], 'Enrollment Timezone' => $timezone, 'Transaction Location' => $transaction_location ); $result = $this->account->addInvoice($this->CardProcessor); if ($result) { $extra_information['Invoice Page']=sprintf("https://admin.ag-projects.com/admin/invoice.phtml?iId=%d&adminonly=1",$result['invoice']); } if ($this->CardProcessor->saveOrder($_POST,$pay_process_results,$extra_information)) { $this->transaction_results=array('success' => true, 'id' => $this->CardProcessor->transaction_data['TRANSACTION_ID'] ); return true; } else { $log=sprintf("Error: SIP Account %s - CC transaction %s failed to save order",$this->account->account, $this->CardProcessor->transaction_data['TRANSACTION_ID']); syslog(LOG_NOTICE, $log); return false; } } else { print _("Invalid CC Request"); return false; } print " "; } else { print " "; // print the submit form $arr_form_page_objects = $this->CardProcessor->showSubmitForm(); print $arr_form_page_objects['page_body_content']; print " "; } } function fraudDetected() { if (count($this->deny_ips)) { foreach ($this->deny_ips as $_ip) { if ($this->account->Preferences['ip'] && preg_match("/^$_ip/",$this->account->Preferences['ip'])) { $this->fraud_reason=$this->account->Preferences['ip'].' is Blocked'; return true; } if (preg_match("/^$_ip/",$_SERVER['REMOTE_ADDR'])) { $this->fraud_reason=$_SERVER['REMOTE_ADDR'].' is a Blocked'; return true; } } } if (count($this->deny_countries)) { if ($_loc=geoip_record_by_name($this->account->Preferences['ip'])) { if (in_array($_loc['country_name'],$this->deny_countries)) { $this->fraud_reason=$_loc['country_name'].' is Blocked'; return true; } } } if (count($this->allow_countries)) { if ($_loc=geoip_record_by_name($this->account->Preferences['ip'])) { if (!in_array($_loc['country_name'],$this->allow_countries)) { $this->fraud_reason=$_loc['country_name'].' is Not Allowed'; return true; } } } if (count($this->deny_email_domains)) { if (count($this->accept_email_addresses)) { if (in_array($this->account->email,$this->accept_email_addresses)) return false; } list($user,$domain)= explode("@",$this->account->email); foreach ($this->deny_email_domains as $deny_domain) { if ($domain == $deny_domain) { $this->fraud_reason=sprintf ('Domain %s is Not Allowed',$domain); return true; } } } return false; } } class DIDProcessor { function DIDProcessor() { /* http://www.didww.com/support/ API help page: http://open.didww.com */ $this->db = new DB_CDRTool(); require('didww_soap_library.php'); include("/etc/cdrtool/enrollment/config.ini"); if (!$enrollment['did_username'] || !$enrollment['did_key']) { print '

    Error: Missing DID engine credentials'; return false; } if ($enrollment['did_environment'] == 'production') { $this->did_engine = new WebService_DID_World_Wide__DID_World_Wide_Port(); $this->auth_string = sha1($enrollment['did_username'].$enrollment['did_key']); $this->environment='production'; } else { print "

    Testing DID environment

    "; flush(); $this->did_engine = new WebService_DID_World_Wide__DID_World_Wide_Port_Testing(); $this->auth_string = sha1($enrollment['did_username'].$enrollment['did_key'].'sandbox'); $this->environment='testing'; } $this->did_engine->_options['timeout'] = 30; } function getPrefixesFromRemote () { if (!$this->auth_string) return false; $result = $this->did_engine->didww_getdidwwregions($this->auth_string,$country); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { foreach ($result as $_country) { foreach ($_country->cities as $_city) { $prefix = $_country->country_prefix.$_city->city_prefix; if (!$_city->isavailable) continue; $prefixes[$prefix]=array('country_prefix' => trim($_country->country_prefix), 'country_name' => trim($_country->country_name), 'country_iso' => trim($_country->country_iso), 'city_name' => trim($_city->city_name), 'city_prefix' => trim($_city->city_prefix), 'setup' => $_city->setup, 'monthly' => $_city->monthly ); } } } return $prefixes; } function getPrefixes () { $query=sprintf("select * from ddi_cache where environment = '%s' and DATE_ADD(date, INTERVAL +1 day) > NOW()",addslashes($this->environment)); if (!$this->db->query($query)) return false; if ($this->db->num_rows()) { $this->db->next_record(); $prefixes = json_decode($this->db->f('cache'),true); if (!is_array($prefixes)) { $prefixes = $this->cachePrefixes(); } } else { $prefixes=$this->cachePrefixes(); } return $prefixes; } function cachePrefixes() { if ($prefixes = $this->getPrefixesFromRemote()) { $query=sprintf("delete from ddi_cache where environment = '%s'",addslashes($this->environment)); $this->db->query($query); $query=sprintf("insert into ddi_cache (cache,date,environment) values ('%s', NOW(),'%s')",addslashes(json_encode($prefixes)),addslashes($this->environment)); $this->db->query($query); return $prefixes; } else { return false; } } function getResellerInfo() { if (!$this->auth_string) return false; $result = $this->did_engine->didww_getdidwwapidetails($this->auth_string); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { print "

    ";
                 print_r($result);
                 print "
    "; } } function createOrder($data) { if (!$this->auth_string) return false; print "
    ";
             print_r($data);
             print "
    "; $result = $this->did_engine->didww_ordercreate($this->auth_string, $data['customer_id'], $data['country_iso'], $data['city_prefix'], $data['period'], $data['map_data'], $data['prepaid_funds'], $data['uniq_hash'] ); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { $query=sprintf ("insert into ddi_numbers ( `customer_id`, `country_name`, `city_name`, `did_number`, `did_status`, `did_timeleft`, `did_expire_date_gmt`, `order_id`, `order_status`, `sip_address`, `did_setup`, `did_monthly`, `did_period`, `prepaid_balance`, `environment` ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ", addslashes($data['customer_id']), addslashes($result->country_name), addslashes($result->city_name), addslashes($result->did_number), addslashes($result->did_status), addslashes($result->did_timeleft), addslashes($result->did_expire_date_gmt), addslashes($result->order_id), addslashes($result->order_status), addslashes($data['map_data']['map_detail']), addslashes($result->did_setup), addslashes($result->did_monthly), addslashes($result->did_period), addslashes($result->prepaid_balance), addslashes($this->environment) ); if (!$this->db->query($query)) { $log=sprintf ("Database error for DID createOrder: %s (%s)",$this->db->Error,$this->db->Errno); print $log; syslog(LOG_NOTICE, $log); } } } function renewOrder($data) { if (!$this->auth_string) return false; print "

    ";
             print_r($data);
             print "
    "; $result = $this->did_engine->didww_orderautorenew($this->auth_string, $data['customer_id'], $data['number'], $data['period'], $data['uniq_hash'] ); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { $query=sprintf ("update ddi_numbers set did_timeleft = '%s' and did_expire_date_gmt = '%s' where did_number = '%s' ", addslashes($result->did_timeleft), addslashes($result->did_expire_date_gmt), addslashes($result->did_number) ); if (!$this->db->query($query)) { $log=sprintf ("Database error for DID renewOrder: %s (%s)",$this->db->Error,$this->db->Errno); print $log; syslog(LOG_NOTICE, $log); } print $query; } } function cancelOrder($data) { if (!$this->auth_string) return false; print "

    ";
             print_r($data);
             print "
    "; $result = $this->did_engine->didww_ordercancel($this->auth_string, $data['customer_id'], $data['number'] ); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); printf ("

    Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring); return false; } else { $query=sprintf ("delete from ddi_numbers where did_number = '%s'",addslashes($result->did_number)); if (!$this->db->query($query)) { $log=sprintf ("Database error for DID cancelOrder: %s (%s)",$this->db->Error,$this->db->Errno); print $log; syslog(LOG_NOTICE, $log); } print $query; } } function getOrders($sip_address) { $orders=array(); $query=sprintf ("select * from ddi_numbers where sip_address = '%s' and environment = '%s'",addslashes($sip_address),addslashes($this->environment)); if (!$this->db->query($query)) { $log=sprintf ("Database error for DID createOrder: %s (%s)",$this->db->Error,$this->db->Errno); print $log; syslog(LOG_NOTICE, $log); } else { while ($this->db->next_record()) { $orders[$this->db->f('did_number')]=array('country_name' => $this->db->f('country_name'), 'city_name' => $this->db->f('city_name'), 'did_status' => $this->db->f('did_status'), 'did_timeleft' => $this->db->f('did_timeleft'), 'did_expire_date_gmt' => $this->db->f('did_expire_date_gmt'), 'order_id' => $this->db->f('order_id'), 'order_status' => $this->db->f('order_status'), 'sip_address' => $this->db->f('sip_address'), 'did_setup' => $this->db->f('did_setup'), 'did_monthly' => $this->db->f('did_monthly') ); } } return $orders; } } function RandomIdentifier($length = 30) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, strlen($characters) - 1)]; } return $randomString; } function getDisplayNameFromFromHeader($header) { // match all words and whitespace, will be terminated by '<' $name = preg_match("/([\w\s]+).*<.*/", $header, $matches); if (isset($matches[1])) { return trim($matches[1]); } else { return ""; } } if (file_exists("/etc/cdrtool/local/sip_settings.php")) { require_once '/etc/cdrtool/local/sip_settings.php'; } ?> diff --git a/library/sip_statistics.php b/library/sip_statistics.php index 5fa5cde..4217050 100644 --- a/library/sip_statistics.php +++ b/library/sip_statistics.php @@ -1,954 +1,954 @@ allowedDomains = $allowedDomains; $this->soapEngineId = $engineId; require("/etc/cdrtool/ngnpro_engines.inc"); require_once("ngnpro_soap_library.php"); $this->SOAPlogin = array( "username" => $soapEngines[$this->soapEngineId]['username'], "password" => $soapEngines[$this->soapEngineId]['password'], "admin" => true ); $this->SOAPurl = $soapEngines[$this->soapEngineId]['url']; $this->SoapAuth = array('auth', $this->SOAPlogin , 'urn:AGProjects:NGNPro', 0, ''); $this->soapclient = new WebService_NGNPro_NetworkPort($this->SOAPurl); $this->soapclient->setOpt('curl', CURLOPT_TIMEOUT, 5); $this->soapclient->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0); $this->soapclient->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0); if (is_array($soapEngines[$this->soapEngineId]['hostnames'])) { $this->hostnames = $soapEngines[$this->soapEngineId]['hostnames']; } else { $this->hostnames = array(); } } public function getStatistics() { $this->soapclient->addHeader($this->SoapAuth); $result = $this->soapclient->getStatistics(); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault = $result->getFault(); $error_code = $result->getCode(); $log = sprintf("Error from %s: %s: %s", $this->SOAPurl, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } $this->statistics = json_decode($result, true); foreach (array_keys($this->statistics) as $_ip) { if ($_ip == 'summary') { foreach (array_keys($this->statistics[$_ip]) as $_role) { if ($_role == 'sip_proxy') { foreach (array_keys($this->statistics[$_ip][$_role]) as $_section) { foreach (array_keys($this->statistics[$_ip][$_role][$_section]) as $_domain) { if (count($this->allowedDomains) && !in_array($_domain, $this->allowedDomains)) { continue; } if (count($this->allowedDomains) && !in_array($_section, $this->allowedSummary)) { continue; } $this->sip_summary[$_section]=$this->sip_summary[$_section]+$this->statistics[$_ip][$_role][$_section][$_domain]; } } } } continue; } foreach (array_keys($this->statistics[$_ip]) as $_role) { if ($_role == 'sip_proxy') { $this->node_statistics[$_ip]['sip_proxy']=true; foreach (array_keys($this->statistics[$_ip][$_role]) as $_section) { foreach (array_keys($this->statistics[$_ip][$_role][$_section]) as $_domain) { if (count($this->allowedDomains) && !in_array($_domain, $this->allowedDomains)) { continue; } $this->domain_statistics[$_domain][$_section] = $this->domain_statistics[$_domain][$_section] + $this->statistics[$_ip][$_role][$_section][$_domain]; $this->domain_statistics['total'][$_section] = $this->domain_statistics['total'][$_section] + $this->statistics[$_ip][$_role][$_section][$_domain]; $this->node_statistics[$_ip][$_section] = $this->node_statistics[$_ip][$_section] + $this->statistics[$_ip][$_role][$_section][$_domain]; } } } } } } public function getStatus() { $this->soapclient->addHeader($this->SoapAuth); $result = $this->soapclient->getStatus(); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault = $result->getFault(); $error_code = $result->getCode(); $log=sprintf("Error from %s: %s: %s", $this->SOAPurl, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring); syslog(LOG_NOTICE, $log); return false; } $this->status = json_decode($result, true); foreach (array_keys($this->status) as $_id) { foreach ($this->status[$_id]['roles'] as $_role) { if ($_role == 'sip_proxy') { $this->sip_proxies[$this->status[$_id]['ip']]++; } if ($_role == 'thor_dnsmanager') { $this->dns_managers[$this->status[$_id]['ip']]++; } if ($_role == 'thor_manager') { $this->thor_managers[$this->status[$_id]['ip']]++; } if ($_role == 'conference_server') { $this->conference_servers[$this->status[$_id]['ip']]++; } if ($_role == 'voicemail_server') { $this->voicemail_servers[$this->status[$_id]['ip']]++; } $ip=$this->status[$_id]['ip']; $this->roles[$_role][$ip]=array( 'ip' => $ip, 'version' => $this->status[$_id]['version'] ); foreach (array_keys($this->status[$_id]) as $_attr) { if ($_attr == 'ip' || $_attr == 'version' || $_attr == 'roles') { continue; } $this->roles[$_role][$ip]['attributes'][$_attr]=$this->status[$_id][$_attr]; } } } } public function showStatus() { $this->getStatus(); print "

    "; print ""; if (count($this->allowedDomains)) { print ""; } else { print ""; } foreach (array_keys($this->roles) as $_role) { if (count($this->allowedDomains)) { if (!in_array($_role, $this->allowedRoles)) { continue; } } foreach ($this->roles[$_role] as $_entity) { if (!$print_role[$_role]) { $_role_print = preg_replace("/_/", " ", $_role); } else { $_role_print = ''; } if (count($this->allowedDomains)) { printf( "", ucfirst($_role_print), $this->ip2host($_entity['ip']), $_entity['version'] ); } else { $a_print = ''; if (is_array($_entity['attributes'])) { foreach (array_keys($_entity['attributes']) as $_a1) { if ($_a1 == 'dburi') { if (preg_match("/^(mysql:\/\/\w*):\w*(@.*)$/", $_entity['attributes'][$_a1], $m)) { $val = $m[1].':xxx'.$m[2]; } else { $val = $_entity['attributes'][$_a1]; } } else { $val=$_entity['attributes'][$_a1]; } $a_print .= sprintf("%s=%s ", $_a1, $val); } } printf( "", ucfirst($_role_print), $this->ip2host($_entity['ip']), $_entity['version'], $a_print ); } $print_role[$_role]++; } } print "
    RoleAddressVersion
    RoleAddressVersionAttributes
    %s%s%s
    %s%s%s%s
    "; } public function showStatistics() { $this->getStatistics(); print "
    "; print ""; foreach (array_keys($this->sip_summary) as $_section) { $_section_print = preg_replace("/_/", " ", $_section); printf("", ucfirst($_section_print)); } print ""; foreach (array_keys($this->sip_summary) as $_section) { printf("", $this->sip_summary[$_section]); } print ""; print "
    %s
    %s
    "; } private function ip2host($ip) { if ($this->hostnames[$ip]) { return $this->hostnames[$ip]; } else { return $ip; } } } class SipThorNetworkImage { // plot graphical SIP Thor network status public $imgsize = 630; public $nodes = array(); public $node_statistics = array(); public $display_options = array(); public $accounts_item = 'online_accounts'; public function __construct($engineId, $allowedDomains = array(), $display_options = array()) { if (!strlen($engineId)) { return false; } if (is_array($display_options)) { $this->display_options = $display_options; } if (array_key_exists('accounts_item', $this->display_options)) { $this->accounts_item=$this->display_options['accounts_item']; } $this->soapEngineId=$engineId; $NetworkStatistics = new NetworkStatistics($engineId, $allowedDomains); $NetworkStatistics->getStatus(); $NetworkStatistics->getStatistics(); $this->sip_proxies = $NetworkStatistics->sip_proxies; $this->conference_servers = $NetworkStatistics->conference_servers; $this->voicemail_servers = $NetworkStatistics->voicemail_servers; $this->dns_managers = $NetworkStatistics->dns_managers; $this->thor_mangers = $NetworkStatistics->thor_managers; $this->node_statistics = $NetworkStatistics->node_statistics; $this->hostnames = $NetworkStatistics->hostnames; if (!$this->display_options['hide_sessions']) { require_once("media_sessions.php"); $MediaSessions = new MediaSessionsNGNPro($engineId); $MediaSessions->getSummary(); foreach ($MediaSessions->summary as $_relay) { $this->node_statistics[$_relay['ip']]['sessions']=$_relay['session_count']; } } } public function returnImageData() { if ($this->display_options['hide_accounts']) { foreach ($this->node_statistics as $key => $value) { if ($value['sip_proxy']) { $this->node_statistics[$key] = array(); $this->node_statistics[$key]['sip_proxy'] = true; } } } return $this; } public function buildImage() { $img = imagecreatetruecolor($this->imgsize, $this->imgsize); $white = imagecolorallocate($img, 255, 255, 255); $black = imagecolorallocate($img, 0, 0, 0); imagefill($img, 0, 0, $white); $c=count($this->sip_proxies); $cx=$this->imgsize/2; $cy=$cx; $radius=0.7*$cx; // Sip Thor node image $sip_thor_node_img = @imagecreatefrompng('SipThorNode.png'); list($nw, $nh) = getimagesize('SipThorNode.png'); // Internet cloud Image $cloud_img = @imagecreatefrompng('InternetCloud.png'); list($cw, $ch) = getimagesize('InternetCloud.png'); // Sip Thor title rectangle image $sip_thor_background_img = @imagecreatefrompng('SipThorNetworkBackground.png'); list($tw, $th) = getimagesize('SipThorNetworkBackground.png'); if (!$this->display_options['hide_frame']) { imagecopy($img, $sip_thor_background_img, $this->imgsize/2-$tw/2, $this->imgsize/2-$th/2, 0, 0, $tw, $th); } imagecopy($img, $cloud_img, $this->imgsize/2-$cw/2, $this->imgsize/2-$ch/2, 0, 0, $cw, $ch); $dash=false; $dashsize=2; for ($angle=0; $angle<=(180+$dashsize); $angle+=$dashsize) { $x = ($radius * cos(deg2rad($angle))); $y = ($radius * sin(deg2rad($angle))); if ($dash) { imageline($img, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $black); imageline($img, $cx-$px, $cx-$py, $cx-$x, $cy-$y, $black); } $dash=!$dash; $px=$x; $py=$y; if ($dash) { imageline($img, $cx+$px, $cy+$py, $cx+$x, $cy+$y, $black); imageline($img, $cx-$px, $cx-$py, $cx-$x, $cy-$y, $black); } } if (count($this->dns_managers)) { $h1=0; $t=count($this->dns_managers); foreach (array_keys($this->dns_managers) as $_ip) { imagecopy($img, $sip_thor_node_img, $this->imgsize - 120 - $h1, 0, 0, 0, $nw - 20, $nh - 20); $text = sprintf("DNS%s", $t--); imagestring($img, 3, $this->imgsize - 65 - $h1, 80, $text, $black); $v1 = $v1+10; $h1 = $h1+50; } $v1=100; foreach (array_keys($this->dns_managers) as $_ip) { imagestring($img, 3, $this->imgsize - 125, $v1, $_ip, $black); $v1=$v1+10; } } if (count($this->node_statistics)) { $dashsize=360/count($this->node_statistics); $j=0; $node_names=array_keys($this->node_statistics); for ($angle=0; $angle<360; $angle+=$dashsize) { $x = ($radius * cos(deg2rad($angle))); $y = ($radius * sin(deg2rad($angle))); if ($this->hostnames[$node_names[$j]]) { $text = $this->hostnames[$node_names[$j]]; // $text = $node_names[$j]; } else { $text = $node_names[$j]; } $px = $x; $py = $y; if (strlen($this->node_statistics[$node_names[$j]]['online_accounts']) && strlen($this->node_statistics[$node_names[$j]]['sessions'])) { if (!$this->display_options['hide_accounts']) { $extra_text1=intval($this->node_statistics[$node_names[$j]][$this->accounts_item]). ' accounts'; } if (!$this->display_options['hide_sessions']) { $extra_text2=intval($this->node_statistics[$node_names[$j]]['sessions']). ' sessions'; } } else if (strlen($this->node_statistics[$node_names[$j]]['online_accounts'])) { if (!$this->display_options['hide_accounts']) { $extra_text1=intval($this->node_statistics[$node_names[$j]][$this->accounts_item]). ' accounts'; } else { $extra_text1=$node_names[$j]; } $extra_text2=""; } else if (strlen($this->node_statistics[$node_names[$j]]['sessions'])) { if (!$this->display_options['hide_sessions']) { $extra_text1=intval($this->node_statistics[$node_names[$j]]['sessions']). ' sessions'; } $extra_text2=""; } if (($angle >= 120 && $angle < 240)) { imagestring($img, 3, $cx+$px-70, $cy+$py-72, $text, $black); imagestring($img, 3, $cx+$px-70, $cy+$py-62, $extra_text1, $black); imagestring($img, 3, $cx+$px-70, $cy+$py-52, $extra_text2, $black); } else { imagestring($img, 3, $cx+$px-110, $cy+$py-30, $text, $black); imagestring($img, 3, $cx+$px-110, $cy+$py-20, $extra_text1, $black); imagestring($img, 3, $cx+$px-110, $cy+$py-10, $extra_text2, $black); } imagecopy($img, $sip_thor_node_img, $cx + $px - $nw / 2 + 7, $cy + $py - $nh / 2 + 5, 0, 0, $nw - 20, $nh - 20); $j++; } } return $img; } } class SIPstatistics { // build graphical statistics with sip registrar and media relay usage public $domains = array('total'=>'total'); public function __construct() { global $CDRTool; $this->path=$CDRTool['Path']; $this->harvest_file = "/tmp/CDRTool-sip-statistics.txt"; $this->harvest_script = $this->path."/scripts/harvestStatistics.php"; $this->mrtgcfg_dir = $this->path."/status/usage"; $this->mrtgcfg_file = $this->path."/status/usage/sip_statistics.mrtg"; $this->mrtg_data_script = $this->path."/scripts/generateMrtgData.php"; $this->mrtg_config_script = $this->path."/scripts/generateMrtgConfig.php"; $this->getDomains(); } private function getDomains() { global $CDRTool; if (!is_array($CDRTool['statistics']['domains'])) { return; } foreach ($CDRTool['statistics']['domains'] as $_domain) { $this->domains[$_domain]=$_domain; } } public function generateMrtgConfigFile() { if (!$handle = fopen($this->mrtgcfg_file, 'w+')) { echo "Error opening {$this->mrtgcfg_file}.\n"; return 0; } // printing cfg header fwrite($handle, " ### Global Config Options WorkDir: {$this->mrtgcfg_dir} IconDir: {$this->mrtgcfg_dir}/images Refresh: 300 #WriteExpires: Yes "); while (list($key, $value) = each($this->domains)) { fwrite($handle, "\n\n ## {$key} Target[{$key}_users]: `{$this->mrtg_data_script} {$key} users` Options[{$key}_users]: growright, gauge, nobanner BodyTag[{$key}_users]: #PNGTitle[{$key}_users]:
    Online Users for {$key}
    MaxBytes[{$key}_users]: 5000000 Title[{$key}_users]: Online Users for {$key} ShortLegend[{$key}_users]: U XSize[{$key}_users]: 300 YSize[{$key}_users]: 75 Ylegend[{$key}_users]: Users Legend1[{$key}_users]: Online Users LegendI[{$key}_users]: Online Users LegendO[{$key}_users]: PageTop[{$key}_users]:

    Online Users for {$key}

    Target[{$key}_sessions]: `{$this->mrtg_data_script} {$key} sessions` Options[{$key}_sessions]: growright, nobanner, gauge BodyTag[{$key}_sessions]: MaxBytes[{$key}_sessions]: 50000 Title[{$key}_sessions]: Sessions Statistics for {$key} ShortLegend[{$key}_sessions]: Ses XSize[{$key}_sessions]: 300 YSize[{$key}_sessions]: 75 Ylegend[{$key}_sessions]: Sessions Legend1[{$key}_sessions]: Active Sessions LegendI[{$key}_sessions]: Active Sessions LegendO[{$key}_sessions]: PageTop[{$key}_sessions]:

    Active Sessions for {$key}

    Target[{$key}_traffic]: `{$this->mrtg_data_script} {$key} traffic` Options[{$key}_traffic]: gauge, growright, bits, nobanner BodyTag[{$key}_traffic]: #PNGTitle[{$key}_traffic]: {$key} traffic MaxBytes[{$key}_traffic]: 1250000000 Title[{$key}_traffic]: IP traffic for {$key} XSize[{$key}_traffic]: 300 YSize[{$key}_traffic]: 75 Legend1[{$key}_traffic]: Caller Traffic in Bits per Second Legend2[{$key}_traffic]: Called Traffic in Bits per Second LegendI[{$key}_traffic]: caller LegendO[{$key}_traffic]: called PageTop[{$key}_traffic]:

    IP Traffic for {$key}

    "); } fclose($handle); } public function generateMrtgData($domain, $dataType) { $value1 = 0; $value2 = 0; $domain = str_replace(".", "\.", $domain); $lines = explode("\n", file_get_contents($this->harvest_file)); foreach ($lines as $line) { if (preg_match("/^$domain\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/", $line, $m)) { if ($dataType == 'sessions') { $value1 = $m[2]; $value2 = $m[2]; } else if ($dataType == 'traffic') { $value1 = $m[3]; $value2 = $m[4]; } else if ($dataType == 'users') { $value1 = $m[1]; $value2 = $m[1]; } } } printf("%d\n%d\n0\n0\n\n", $value1, $value2); } public function getOnlineAccountsFromMySQL($class) { $domains = array(); $online_devices = 0; $online_accounts = 0; if (!class_exists($class)) { return array(); } $db = new $class(); $query="select count(*) as c, domain from location group by domain"; dprint_sql($query); if (!$db->query($query)) { $log=sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if (!$db->num_rows()) { return array(); } while ($db->next_record()) { $domains[$db->f('domain')]['online_devices'] = intval($db->f('c')); $online_devices = $online_devices + intval($db->f('c')); } $query="select count(distinct(concat(username,domain))) as c, domain from location group by domain"; dprint_sql($query); if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno); print $log; syslog(LOG_NOTICE, $log); return array(); } if (!$db->num_rows()) { return array(); } while ($db->next_record()) { $domains[$db->f('domain')]['online_accounts'] = intval($db->f('c')); $online_accounts=$online_accounts+intval($db->f('c')); } $domains['total']['online_devices']=$online_devices; $domains['total']['online_accounts']=$online_accounts; return $domains; } private function writeHarvestFile($body) { if (!strlen($body)) { return 0; } if (!$handle = fopen($this->harvest_file, 'w+')) { $log=sprintf("Error opening mrtg harvest file %s\n", $this->harvest_file); print $log; syslog(LOG_NOTICE, $log); return false; } fwrite($handle, $body); fclose($handle); } public function harvestStatistics() { global $DATASOURCES; $datasources = array_keys($DATASOURCES); $totals = array(); foreach ($datasources as $datasource) { if (!$DATASOURCES[$datasource]['skipStatistics']) { if ($DATASOURCES[$datasource]['mediaSessions']) { // MediaProxy 2 via NGNPro require_once("media_sessions.php"); $MediaSessions = new MediaSessionsNGNPro($DATASOURCES[$datasource]['mediaSessions']); $MediaSessions->getSessions(); $totals = array_merge_recursive($totals, $MediaSessions->domain_statistics); } else if ($DATASOURCES[$datasource]['mediaDispatcher']) { // MediaProxy 2 via dispatcher tcp socket require_once("media_sessions.php"); $MediaSessions = new MediaSessions($DATASOURCES[$datasource]['mediaDispatcher']); $MediaSessions->getSessions(); $totals = array_merge_recursive($totals, $MediaSessions->domain_statistics); } else if ($DATASOURCES[$datasource]['mediaServers']) { // MediaProxy 1 via relay tcp socket $MediaSessions = new MediaSessions1($DATASOURCES[$datasource]['mediaServers'], $allowedDomains); $MediaSessions->getSessions(); $totals = array_merge_recursive($totals, $MediaSessions->domain_statistics); } if ($DATASOURCES[$datasource]['networkStatus']) { // OpenSIPS via NGNPro $NetworkStatistics = new NetworkStatistics($DATASOURCES[$datasource]['networkStatus']); $NetworkStatistics->getStatistics(); $totals = array_merge_recursive($totals, $NetworkStatistics->domain_statistics); } else if ($DATASOURCES[$datasource]['db_registrar']) { // OpenSIPS via MySQL query $db_registrar_domains=$this->getOnlineAccountsFromMySQL($DATASOURCES[$datasource]['db_registrar']); $totals = array_merge_recursive($totals, $db_registrar_domains); } } } $body="domains\t\t\tonline_accounts\tsessions\tcaller\tcallee\n\n"; foreach (array_keys($totals) as $_domain) { if (!$totals[$_domain]['online_accounts'] && !$totals[$_domain]['sessions']) { continue; } $body .= sprintf( "%s\t\t%d\t\t%d\t\t%s\t%s\n", $_domain, $totals[$_domain]['online_accounts'], $totals[$_domain]['sessions'], intval($totals[$_domain]['caller']), intval($totals[$_domain]['callee']) ); } $this->writeHarvestFile($body); } public function buildStatistics() { system($this->mrtg_config_script); system($this->harvest_script); system("env LANG=C mrtg $this->mrtgcfg_file"); } } /** * MRTGGraphs class sets up the dashboard and creates Entity objects. */ class MRTGGraphs { /** * MRTG entities * * @var array */ public $entities = array(); /** * Server hostname; * * @var type */ public $hostname; /** * Domains; * * @var type */ public $domains = array(); /** * Graphs types; * * @var type */ public $graph_types = array('users','sessions','traffic'); /** * Construct. */ public function __construct() { //require("sip_statistics.php"); $title='Platform usage'; if (is_readable("/etc/cdrtool/local/header.phtml")) { include("/etc/cdrtool/local/header.phtml"); } else { include("header.phtml"); } $layout = new pageLayoutLocal(); $layout->showTopMenu($title); global $CDRTool; $SIPstatistics = new SIPstatistics(); $allowedDomains = ''; if (strlen($CDRTool['filter']['domain'])) { $allowedDomains = explode(' ', $CDRTool['filter']['domain']); } if (is_array($allowedDomains)) { $domains = array_intersect($allowedDomains, array_keys($SIPstatistics->domains)); } else { $domains = array_keys($SIPstatistics->domains); } $this->domains[]= $domains; // read entities in directory for each entry in domain list foreach ($domains as $entity) { $entity = sprintf("status/usage/%s", $entity); foreach ($this->graph_types as $type) { $final_entity = sprintf("%s_%s.log", $entity, $type); $this->entities[] = new MRTGEntity(preg_replace("/.log$/", "", $final_entity)); } } $this->layout = $layout; // determine hostname exec("hostname -f", $hostname); $this->hostname = $hostname[0]; } } /** * Entity class represents each MRTG entity found in the directory. */ class MRTGEntity { /** * Entity name. * * @var string */ public $name; /** * Entity title. * * @var string */ public $title; /** * Entity page link. * * @var string */ public $link; /** * Entity log file. * * @var string */ public $log; /** * Construct. * * @throws Exception */ public function __construct($name) { // check entity exists if (!is_file("{$name}.html")) { throw new Exception("Could not find MRTG files for entity {$name}"); } // add name $this->name = $name; // create nicer-looking title $np = explode('_', $name); $this->title = preg_replace("/status\/usage\//", "", $np[0]); array_shift($np); if (in_array('users', $np) && strstr($this->title, 'total')) { $this->title = ucfirst($this->title)." SIP Accounts online"; } else if (in_array('users', $np)) { $this->title = "Online SIP accounts on $this->title"; } else if (in_array('traffic', $np) && strstr($this->title, 'total')) { $this->title = ucfirst($this->title)." relayed RTP traffic"; } else if (in_array('traffic', $np)) { $this->title = "Relayed RTP traffic for $this->title"; } else if (in_array('sessions', $np) && strstr($this->title, 'total')) { $this->title = ucfirst($this->title)." active RTP media sessions"; } else if (in_array('sessions', $np)) { $this->title = "Active RTP media sessions for $this->title"; } else { $this->title .= " (".implode(" ", $np).")"; } // add HTML and log files $this->link = $name.'.html'; $this->log = $name.'.log'; } /** * Retrieve and process the entity's log file. * * @param boolean $max Set to true to retrieve maximum in/out rather than average. * * @return string JSON encoded data */ public function retrieveLog($max = false) { // arrays for parsed data $in = $out = $stamps = array(); global $start_date,$stop_date; foreach (file("{$this->name}.log") as $line) { // ignore the summary line if (!isset($header)) { $header = $line; continue; } $parts = explode(' ', rtrim($line)); //if ($parts[1] == 0 && $parts[2] == 0 && $parts[3] == 0 && $parts[4] == 0) continue; if ($parts[0] < $start_date->getTimestamp()) { continue; } if ($parts[0] > $stop_date->getTimestamp()) { continue; } array_push($stamps, $parts[0]); if (strstr($this->name, 'traffic')) { if ($max) { $in[] = array($parts[0],round(($parts[3]*8)/1000)); $out[] = array($parts[0]*1000,round(($parts[4]*8)/1000)); } else { $in[] = array(date('Y-m-d H:i:s', $parts[0]), round(($parts[1]*8))); $out[] = array(date('Y-m-d H:i:s', $parts[0]), round(($parts[2]*8))); } } else { if ($max) { $in[] = array(date('Y-m-d H:i:s', $parts[0]),round($parts[3])); $out[] = array(date('Y-m-d H:i:s', $parts[0]),round($parts[4])); } else { $in[] = array(date('Y-m-d H:i:s', $parts[0]),round($parts[1])); $out[] = array(date('Y-m-d H:i:s', $parts[0]),round($parts[2])); } } } // determine earliest and latest timestamps $latest = array_shift($stamps); $earliest = array_pop($stamps); $interval = 300; // encode and return response return json_encode(array( 'earliest' => $earliest, 'latest' => $latest, 'start' => $start_date, 'stop' => $stop_date, 'interval' => $interval, 'intervalMin' => round($interval/60, 0), 'inData' => array_reverse($in), 'outData' => array_reverse($out) )); } } ?> diff --git a/provisioning.phtml b/provisioning.phtml index 0cc0e46..88e22b6 100644 --- a/provisioning.phtml +++ b/provisioning.phtml @@ -1,159 +1,159 @@ "CDRTool_Session", "auth" => "CDRTool_Auth", "perm" => "CDRTool_Perm" ) ); $title = "Provisioning"; if (is_readable("/etc/cdrtool/local/header.phtml")) { include '/etc/cdrtool/local/header.phtml'; } else { include 'header.phtml'; } $perm->check("provisioning"); if ($_REQUEST['action'] == 'PerformActions' && $_REQUEST['sub_action'] == 'export') { $export = true; } if ($export) { Header("Content-type: application/json"); Header("Content-Disposition: attachment; filename=ngnpro_export.json"); } else { $layout = new pageLayoutLocal(); $layout->showTopMenu($title); } global $CDRTool; $login_credentials = array(); $login_credentials['username'] = $auth->auth["uname"]; if ($CDRTool['impersonate']) { if (preg_match("/^([0-9]*)\.([0-9]*)$/", $CDRTool['impersonate'], $m)) { $_customer = $m[1]; $_reseller = $m[2]; } else { page_close(); printf("Error: Invalid impersonate value %s", $CDRTool['impersonate']); exit; } if ($_customer == "0" && $_reseller == "0") { $login_credentials['login_type'] = 'admin'; $login_credentials['reseller'] = '0'; } else if ($_customer == $_reseller) { $login_credentials = array( 'soap_username' => $CDRTool['soap_username'], 'soap_password' => $CDRTool['soap_password'], 'customer' => $_customer, 'reseller' => $_reseller, 'login_type' => 'reseller' ); } else { $login_credentials = array( 'soap_username' => $CDRTool['soap_username'], 'soap_password' => $CDRTool['soap_password'], 'customer' => $_customer, 'reseller' => $_reseller, 'login_type' => 'customer' ); } $login_credentials['username'] = $auth->auth["uname"]; } else { page_close(); printf("Please define impersonate field for login account %s", $auth->auth["uname"]); exit; } if (file_exists("/etc/cdrtool/ngnpro_engines.inc")) { require '/etc/cdrtool/ngnpro_engines.inc'; } else { page_close(); printf("Error: you must copy setup/ngnpro_engines.inc.sample to /etc/cdrtool/ngnpro_engines.inc and edit it before trying again"); exit; } if (array_key_exists($login_credentials['reseller'], $resellerFilters)) { $login_credentials['soap_filter'] = $resellerFilters[$login_credentials['reseller']]['soap_filter']; $login_credentials['record_generator'] = $resellerFilters[$login_credentials['reseller']]['record_generator']; $login_credentials['name_servers'] = $resellerFilters[$login_credentials['reseller']]['name_servers']; } else if ($resellerFilters['default']) { $login_credentials['soap_filter'] = $resellerFilters['default']['soap_filter']; $login_credentials['record_generator'] = isset($resellerFilters['default']['record_generator']) ? $resellerFilters['default']['record_generator'] : ''; $login_credentials['name_servers'] = isset($resellerFilters['default']['name_servers']) ? $resellerFilters['default']['name_servers'] : '' ; } $login_credentials['reseller_filters'] = $resellerFilters; $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; if (isset($_REQUEST['generatorId'])) { $generator = new recordGenerator($_REQUEST['generatorId'], $recordGenerators, $soapEngines, $login_credentials); if ($action == 'Generate') { $generator->generateRecords(); $generator->showGeneratorForm(); } else { $generator->showGeneratorForm(); } } else { $service = isset($_REQUEST['service']) ? $_REQUEST['service'] : '' ; $SoapEngine = new SoapEngine($service, $soapEngines, $login_credentials); $_class = $SoapEngine->records_class; $RECORDS = new $_class($SoapEngine); $RECORDS->showWelcomeMessage(); if ($action =='Add') { $RECORDS->addRecord(); } if ($action =='Copy') { $RECORDS->copyRecord(); } if ($action =='Delete') { $RECORDS->deleteRecord(); } if ($action =='Update') { $RECORDS->updateRecord(); } if ($action == 'PerformActions') { $RECORDS->executeActions(); } else { $RECORDS->listRecords(); } } if (!$export) { $layout->showFooter(); echo " "; } page_close(); ?> diff --git a/sip_enrollment.phtml b/sip_enrollment.phtml index 539ac11..895b968 100644 --- a/sip_enrollment.phtml +++ b/sip_enrollment.phtml @@ -1,20 +1,20 @@ createAccount(); ?> diff --git a/sip_login_reminder.phtml b/sip_login_reminder.phtml index 96f651f..1d2f10c 100644 --- a/sip_login_reminder.phtml +++ b/sip_login_reminder.phtml @@ -1,232 +1,232 @@ 'admin'); $SoapEngine = new SoapEngine('sip_accounts', $soapEngines, $login_credentials); $_class = $SoapEngine->records_class; $RECORDS = new $_class($SoapEngine); $login_credentials['sip_engine'] = $RECORDS->SoapEngine->sip_engine; if ($_REQUEST['id']) { $id = $_REQUEST['id']; $db = new DB_CDRTool(); $query="delete from memcache where `key` LIKE 'email_%' and NOW() >= `expire`"; if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)\n", $query, $db->Error, $db->Errno); syslog(LOG_NOTICE, $log); } else { $log = sprintf("Purged %d records from memcache\n", $db->affected_rows()); syslog(LOG_NOTICE, $log); } $query = sprintf( "select * from memcache where `key`='email_%s'", addslashes($id) ); if (!$db->query($query)) return false; if ($db->num_rows()) { $db->next_record(); $account = json_decode($db->f('value'), true); if (!($_REQUEST['sip_password'] || $_REQUEST['web_password'])) { $RECORDS->showPasswordReminderUpdateFormEncrypted($_REQUEST['id'], $account['sip_account']); } else { $SipSettings = new SipSettings($account['sip_account'], $login_credentials, $soapEngines); dprint_r($SipSettings->result); if ($_REQUEST['sip_password']) { //print "$SipSettings->password"; if ($SipSettings->store_clear_text_passwords) { $SipSettings->result->password = $_REQUEST['sip_password']; } else { $md1 = strtolower($SipSettings->result->id->username).':'.strtolower($SipSettings->result->id->domain).':'.$sip_password; dprint($md1); dprint(md5($md1)); $md2 = strtolower($SipSettings->result->id->username).'@'.strtolower($SipSettings->result->id->domain).':'.strtolower($SipSettings->result->id->domain).':'.$_REQUEST['sip_password']; $SipSettings->result->password = md5($md1).':'.md5($md2); } } if ($_REQUEST['web_password']) { //dprint_r($SipSettings->result->properties); if ($SipSettings->store_clear_text_passwords) { $web_password_new = $_REQUEST['web_password']; } else { $md1 = strtolower($SipSettings->result->id->username).':'.strtolower($SipSettings->result->id->domain).':'.$_REQUEST['web_password']; $md2 = strtolower($SipSettings->result->id->username).'@'.strtolower($SipSettings->result->id->domain).':'.strtolower($SipSettings->result->id->domain).':'.$_REQUEST['web_password']; $web_password_new = md5($md1).':'.md5($md2); } foreach (array_keys($SipSettings->result->properties) as $_key) { $_prop = $SipSettings->result->properties[$_key]; if ($_prop->name == 'web_password') { $newProperties[] = array( 'name'=> 'web_password', 'value' => $web_password_new ); $found = 1; } else { $newProperties[] = $_prop; } } if (!$found) { $newProperties[] = array( 'name' => 'web_password', 'value' => $web_password_new ); } //if ($SipSettings->result->properties!=$newProperties) $this->somethingChanged=1; if (!$newProperties) $newProperties = array(); $SipSettings->result->properties=$newProperties; //setPreference1('web_password',$_REQUEST['web_password']); } dprint_r($SipSettings->result); $SipSettings->SipPort->addHeader($SipSettings->SoapAuth); $result = $SipSettings->SipPort->updateAccount($SipSettings->result); dprint_r($SipSettings->result); print "

    "; print _("Update passwords"); print "

    "; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); echo "
    "; printf( "Error (SipPort):
    %s (%s): %s
    ", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); return false; } else { echo "
    "; print _("Success"); print "
    "; print _("The password(s) have been updated"); print "
    "; $query = "delete from memcache where `key` LIKE 'email_$id'"; if (!$db->query($query)) { $log = sprintf("Database error for query %s: %s (%s)\n", $query, $db->Error, $db->Errno); syslog(LOG_NOTICE, $log); } flush(); } unset($SipSettings); } } else { echo "

    "; print _("Update passwords"); print "

    "; echo "
    "; print _("Error"); print "
    "; print _("ID not found in the database"); print "
    "; print _("or the password changing session has expired"); print "
    "; flush(); } print "

    Found a SIP account having email address set to '%s':

    ", trim($_REQUEST['email_filter'])); } else { printf("

    Found multiple SIP accounts having email address set to '%s':

    ", trim($_REQUEST['email_filter'])); } //printf ("

    Found a SIP account having email address set to '%s'",trim($_REQUEST['email_filter'])); print ""; print "

    Processing...

    "; print "
      "; print "
    • "; foreach ($accounts as $_account) { $account = $_account['username'].'@'.$_account['domain']; //if ($account == $_REQUEST['sip_filter']) { $SipSettings = new SipSettings($account, $login_credentials, $soapEngines); $success = $success + $SipSettings->sendEmail(true); //print "$sucess"; sleep(1); flush(); //} } if ($success >= "1") { if ($success > "1") { print "Login reminders and password resets have been sent to "; } else { print "Login reminder and password reset have been sent to "; } print $_REQUEST['email_filter']; print "
    • "; print ""; } print "
    "; } } print "

    Back to login page"; } echo ""; ?> diff --git a/sip_settings.phtml b/sip_settings.phtml index 6c3fa57..3167a21 100644 --- a/sip_settings.phtml +++ b/sip_settings.phtml @@ -1,119 +1,119 @@ "CDRTool_Session", "auth" => "CDRTool_Auth", "perm" => "CDRTool_Perm" ) ); $account = $_REQUEST['account']; $reseller = $_REQUEST['reseller']; $customer = $_REQUEST['customer']; $sip_engine = $_REQUEST['sip_engine']; if ($reseller && !$customer) { $customer = $reseller; } else if ($customer && !$reseller) { $reseller = $customer; } $perm->check("provisioning"); global $CDRTool; if ($CDRTool['impersonate']) { if (preg_match("/^([1-9][0-9]*)\.([1-9][0-9]*)$/", $CDRTool['impersonate'], $m)) { $_customer = $m[1]; $_reseller = $m[2]; if ($_customer == $_reseller) { $login_type = 'reseller'; } else { $login_type = 'customer'; } $login_credentials=array( 'customer' => $_customer, 'reseller' => $_reseller, 'login_type' => $login_type ); } else if ($CDRTool['impersonate'] == '0' || $CDRTool['impersonate'] = '0.0') { $login_credentials = array( 'customer' => $customer, 'reseller' => $reseller, 'login_type' => 'admin' ); } else { page_close(); printf("Error: Invalid impersonate value %s", $CDRTool['impersonate']); exit; } } else { page_close(); printf("Error: Missing impersonate setting"); exit; } } else { page_open( array( "sess" => "SIP_Subscriber_Session", "auth" => "SIP_Subscriber_Auth" ) ); $account = $SIP['account']; $reseller = $SIP['reseller']; $customer = $SIP['customer']; $sip_engine = $SIP['engine']; $login_type = "subscriber"; $login_credentials=array( 'login_type' => $login_type, 'customer' => $customer, 'reseller' => $reseller, 'sip_engine' => $sip_engine ); } $_class = 'SipSettings'; $_reseller_class = $_class.$reseller; if (class_exists($_reseller_class)) { $SipSettings_class = $_reseller_class; } else { $SipSettings_class = $_class; } if ($resellerFilters[$login_credentials['reseller']]['sip_engine']) { $login_credentials['sip_engine'] = $resellerFilters[$login_credentials['reseller']]['sip_engine']; } else if ($_REQUEST['sip_engine']) { $login_credentials['sip_engine'] = $_REQUEST['sip_engine']; } else if ($resellerFilters['default']['sip_engine']) { $login_credentials['sip_engine'] = $resellerFilters['default']['sip_engine']; } renderUI($SipSettings_class, $account, $login_credentials, $soapEngines); page_close(); ?> diff --git a/sip_settings_digest.phtml b/sip_settings_digest.phtml index 1ec0ae4..e765a67 100644 --- a/sip_settings_digest.phtml +++ b/sip_settings_digest.phtml @@ -1,48 +1,48 @@ $reseller, 'customer' => $customer, 'login_type' => $login_type, 'sip_engine' => $sip_engine, 'templates_path' => './templates' ); renderUI($SipSettings_class, $account, $login_credentials, $soapEngines); ?> diff --git a/sip_settings_tlscert.phtml b/sip_settings_tlscert.phtml index b37b464..2505cef 100644 --- a/sip_settings_tlscert.phtml +++ b/sip_settings_tlscert.phtml @@ -1,44 +1,44 @@ $reseller, 'customer' => $customer, 'login_type' => $login_type, 'sip_engine' => $sip_engine, 'templates_path' => './templates' ); renderUI($SipSettings_class, $account, $login_credentials, $soapEngines); ?>